题目:输入两个只含有a、b、c的字符串,判断在通过对第一个字符串进行插入或删除aa、bb、abab后是否能变成第二个字符串
题解:以c为分界点对每段消去aa bb abab,然后将两个字符串剩余的部分的集合(消去后每段都是由a|b|ab|ba组成的)进行比较,若两个集合相同则说明可以相互转化。(ab->aababb->babb->ba)所以ab和ba一样推出abab...ab和baba...ba一样。把abab看成dd,我们任务就是消除形如aa的子串,这本质上c 不变,按照 c 分段。只要每段内 a 和 b 的奇偶性相同。异或的法则:a^0=a ,a^a=0,b^a^a=b(b可以看成每段剩余);
想知道异或的相关法则点击打开链接
#include <iostream>
#include <vector>
using namespace std;
vector<int> transform(string s)
{
vector<int>v;
int sum=0;
for (int i=0;i<=s.size();i++)
{
if(i==s.size()||s[i]=='c')
{
v.push_back(sum);
sum=0;
}
else
sum^=s[i];
}
return v;
}
int main ()
{
string s1,s2;
while(cin>>s1>>s2)
{
if(transform(s1)==transform(s2)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}