题目链接: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; }