标签:ems using puts get can hdoj main cst 等于
每组两个串s t 仅仅由小写字母组成 问从s能不能变成t
改变的操作为选一个字符 在后面加上一个与所选字符不同的字符
这样的操作能够做无数次 问能不能达t
首先s能到t的首要条件是 对于随意字母 s中出现的次数小于等于t中出现的次数
其次细致想想能够发现 满足上一条件后 假设不存在连续的同样字符 s肯定能变成t(细致想想
而同样的连续字符假设在串中(不在串首 可不断在其前的字符后累加该字符
因此仅仅需看t开头有没有连续的同样字符 假设与s开头连续的同样字符为同一字符 而且长度小于等于s开头的连续同样字符长度
即为Yes
不满足以上两个条件 即为No
代码例如以下:
#include <iostream> #include <cstring> #include <cstdio> using namespace std; using namespace std; char s[100005],t[100005]; int sz[26],tz[26]; int main() { int T,i,j,lens,lent; bool f; scanf("%d",&T); while(T--) { scanf("%s %s",s,t); if(s[0] != t[0]) { puts("No"); continue; } memset(sz,0,sizeof(sz)); memset(tz,0,sizeof(tz)); lens = lent = 0; f = 0; for(i = 0; s[i]; ++i) { sz[s[i]-‘a‘]++; if(!f && (!i || s[i] == s[i-1])) lens++; else f = 1; } f = 0; for(i = 0; t[i]; ++i) { tz[t[i]-‘a‘]++; if(!f && (!i || t[i] == t[i-1])) lent++; else f = 1; } if(t[0] == s[0] && lens >= lent) { for(i = 0; i < 26; ++i) { if(sz[i] > tz[i]) break; } if(i == 26) puts("Yes"); else puts("No"); } else puts("No"); } return 0; }
标签:ems using puts get can hdoj main cst 等于
原文地址:http://www.cnblogs.com/wzzkaifa/p/7084735.html