标签:多校
每组两个串s t 只由小写字母组成 问从s能不能变成t
改变的操作为选一个字符 在后面加上一个与所选字符不同的字符
这种操作可以做无数次 问能不能达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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:多校
原文地址:http://blog.csdn.net/challengerrumble/article/details/47811893