String Transformation HDU - 6282
原题链接
考察:思维
思路:
每个操作都与c无关,且只+-2个a,b.也就是说这是不改变a,b个数的奇偶性的.因此操作与c无关,所以将每个c分割看成一段,比较奇偶性.
本蒟蒻是纯暴力打法,比较简单的代码就是利用异或了.
Code
#include <iostream>
#include <cstring>
using namespace std;
const int N = 10010;
char a[N],b[N];
int sz_a[N],sz_b[N],cnt_a,cnt_b;
void init()
{
memset(sz_a,0,sizeof sz_a);
memset(sz_b,0,sizeof sz_b);
cnt_a = cnt_b =0;
int alen = strlen(a+1);
for(int i=1;i<=alen;i++)
if(a[i]=='c') sz_a[++cnt_a] = i;
int blen = strlen(b+1);
for(int i=1;i<=blen;i++)
if(b[i]=='c') sz_b[++cnt_b] = i;
sz_a[++cnt_a] = alen+1;
sz_b[++cnt_b] = blen+1;
}
bool solve()
{
if(cnt_a!=cnt_b) return 0;
int alen = strlen(a+1);
int blen = strlen(b+1);
int cnt[2][3];
memset(cnt,0,sizeof cnt);
for(int i=1,j=1,k=1;i<=cnt_a;i++)
{
int ai = sz_a[i],bi = sz_b[i];
for(int s=0;s<2;s++)
for(int p=0;p<2;p++) cnt[s][p] = 0;
while(j<=alen&&j<ai) cnt[0][a[j++]-'a']++;
while(k<=blen&&k<bi) cnt[1][b[k++]-'a']++;
for(int s=0;s<2;s++)
if(cnt[0][s]%2!=cnt[1][s]%2) return 0;
j = ai+1,k = bi+1;
}
return 1;
}
int main()
{
while(scanf("%s%s",a+1,b+1)!=EOF)
{
init();
printf("%s\n",solve()?"Yes":"No");
}
return 0;
}