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;
}

posted @ 2021-06-02 15:46  acmloser  阅读(23)  评论(0编辑  收藏  举报