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