天天看点

hdu-6282 String Transformation--补题 找规律

题意:给出两个只有a,b,c组成的字符串,可以通过删除或者是增加aa,bb,abab改变字符串,问能不能从第一个字符串变成第二个字符串。

条件:1 字符串只有a,b,c组成

            2 通过删除或者是增加aa,bb,abab改变字符串

            3 样例:ab->aababb->babb->ba启示,在没有c的情况下ab的位置是没有关系,那么就只用考虑ab的奇偶个数关系,以每个c为分界点。

思路:以每个c为分界点,考虑每个分成的集合里面ab的奇偶关系,对比两个字符串就好了。比较奇偶的时候可以通过位运算来计算:a^0=a ,a^a=0,b^a^a=b,这样就可以求出每一段剩余的。

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const int maxn=10000;
int l[2][maxn+5];
int transform_s(int x,string s)
{
    int sum=0,num=0;
    for(int i=0;i<=s.size();i++)
    {
        if(i==s.size()||s[i]=='c')
        {
            l[x][num++]=sum;
            sum=0;
        }
        else
            sum^=s[i];
    }
    return num;
}
int main()
{
    string a,b;
    while(cin>>a>>b)
    {
        memset(l,0,sizeof(l));
        int numa=transform_s(0,a);
        int numb=transform_s(1,b);
        int flag=0;
        int i;
        for(i=0;i<numa&&i<numb;i++)
        {
            if(l[0][i]!=l[1][i])
            {
                flag=1;
                break;
            }
        }
        if(numa!=numb)
            flag=1;
        if(flag==1)
            printf("No\n");
        else
            printf("Yes\n");
    }
    return 0;
}
           

总结:1 当时有种畏难情绪,最近组队训练感觉贡献太少了有点失落