2018湘潭邀请赛 G.String Transformation

题目:输入两个只含有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;
}

猜你喜欢

转载自blog.csdn.net/zero_zp/article/details/80348685