题意:给两个串,s和t(只包含a,b,c三种字母),可以对串进行删除或者增加 aa,bb,abab.的操作。问是否能把s串变成t串。
思路:首先,c无法增加和删除,所以只需要考虑c的数量相同和两个c之间的ab串是否匹配。由题意可知 1、aa,bb,abab,等价于空串,空串等价这三个串。2、其次 ab可推出ba,反之也行。3、a => bab=>abb,右边可以无限加两个b。4、a=>bab=>bba,同理左边可以无限加两个b。5、b=>aba=>aab,左边无限加两个a。6、b=>aba=>baa,右边无限加两个aa。所以我们得知,如果s串是奇数个b或者a,那么必定t串也是奇数个b或者a,所以,只要考虑两个c之间的a,b,的奇偶是否相同就行了。代码如下:
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
const int maxn = 1e4+100;
char s[maxn],t[maxn];
int main(){
while(~scanf("%s\n%s",s,t)){
bool flag = true;
int n = strlen(s);
int m = strlen(t);
s[n] = 'c';
s[n+1]='\0';
t[m]='c';
t[m+1]='\0';
++n,++m;
int Sa = 0,Sb = 0;
int Ta = 0,Tb = 0;
int i=0,j=0;
while(i<n&&j<m){
Sa=0,Sb=0;
Ta=0,Tb=0;
while(s[i]!='c'&&s[i]!='\0'){
if(s[i] == 'a') ++Ta;
else ++Tb;
++i;
}
if(s[i]!='\0')
++i;
while(t[j]!='c'&&t[j]!='\0'){
if(t[j]=='a') ++Ta;
else ++Tb;
++j;
}
if(t[j]!='\0')
++j;
if(Sa%2!=Ta%2||Sb%2!=Tb%2){
flag = false;
break;
}
}
// cout<<i<<" "<<j<<endl;
if(i==n&&j==m&&flag){
puts("Yes");
}
else{
puts("No");
}
}
return 0;
}