String Transformation(规律)

题目链接:http://exam.upc.edu.cn/problem.php?id=7040

题意:给你两个s1,s2,然后可以在任意位置加或减{aa,bb,abab};

问你可以通过变化来            得到s2.

后来你会发现这个题其实    与    a和b的奇偶性有关,(不难想到)。。。

1、两个字符串都没有c的情况下,考虑a和b的奇偶性,只要两个串的a和b的奇偶性相同即可。

2、()C()C()C……其实有C就是把它划分成一个一个区间对区间里的a和b的奇偶性来讨论。

贴上代码:

#include<bits/stdc++.h>
using namespace std;
inline int f(char str[],int s,int f,char c){
    int sum=0;
    for(int i=s;i<f;i++){
        if(str[i]==c){
            sum++;
        }
    }
    return sum;
}
int main()
{
    char s1[250000],s2[250000];
    while(scanf("%s %s",s1+1,s2+1)!=EOF){
        int len1=strlen(s1),len2=strlen(s2);
        s1[0]='c',s2[0]='c';
        s1[len1]='c',s1[len1+1]='\0';
        s2[len2]='c',s2[len2+1]='\0';
        int a1,a2,b1,b2,c1,c2;
        a1=a2=b1=b2=c1=c2=0;
        c1=f(s1,1,len1,'c');
        c2=f(s2,1,len2,'c');
        if(c1!=c2){
            printf("No\n");
        }else if(c1==c2&&c1==0){
            a1=f(s1,1,len1,'a');
            b1=f(s1,1,len1,'b');
            a2=f(s2,1,len2,'a');
            b2=f(s2,1,len2,'b');
            if(((a1-a2)%2==0)&&((b1-b2)%2==0)){
                printf("Yes\n");
            }else{
                printf("No\n");
            }
        }else if(c1==c2){
            int cc1[250000]={0},cc2[250000]={0},cnt=0;
            for(int i=0;i<=len1;i++){
                if(s1[i]=='c')cc1[cnt++]=i;
            }cnt=0;
            for(int i=0;i<=len2;i++){
                if(s2[i]=='c')cc2[cnt++]=i;
            }
            int flag=1;
            for(int i=1;i<cnt;i++){
                a1=f(s1,cc1[i-1],cc1[i],'a');
                a2=f(s2,cc2[i-1],cc2[i],'a');
                b1=f(s1,cc1[i-1],cc1[i],'b');
                b2=f(s2,cc2[i-1],cc2[i],'b');
                if(((a1-a2)%2)||((b1-b2)%2)){
                    flag=0;
                    break;
                }
            }
            if(flag){
                printf("Yes\n");
            }else{
                printf("No\n");
            }
        }else{
            printf("No\n");
        }
    }
    return 0;
}


后来看了看网上的博客,看到别人有更加高超的做法:利用vector和异或来实现,不得不佩服。

#include<bits/stdc++.h>
using namespace std;
vector<int>f(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(f(s1)==f(s2))printf("Yes\n");
        else{
            printf("No\n");
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/z_sea/article/details/80412462