题意:可以在字符串任意位置增删aa或bb或abab,给两个字符串,问能否从s变换到t
思路:队友首先说出如果前后a的数量和b的数量奇偶性不一致一定布星,因为增删都是两个两个地删掉。
然后稍作思索,我们发现按照c分割字符串,如果c左右s和t中,a,b的奇偶性发生改变就No 。为什么要考虑c的左右呢,因为增删都无法跨越c。
显然,若c数量不一样,No
接着我们思考是否只要s和t中,a,b的奇偶性不发生改变,就一定可以呢?样例1给出了ab->ba,那么ba->ab只要按照hint逆着操作一遍即可。枚举长度为2的s串到t串的情况,我们发现只要奇偶性不变,就能实现转换。
最后思考长度扩展,长度为3都满足上述条件。
最终结论是:以c为分割点,s串和t串中a和b的奇偶性不发生改变,就OK。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
string s;
string t;
int snuma; //s串中a的个数
int snumb; //s串中b的个数
int tnuma; //t串中a的个数
int tnumb; //t串中b的个数
//
bool judge(string s,string t)
{
//首先判断c的位置是否相同
// int flag1=s.find("c")!=string::npos;
// int flag2=t.find("c")!=string::npos;
// if(flag1&&!flag2) return false;
// if(!flag1&&flag2) return false;
// if(!flag1&&!flag2)
// {
snuma=snumb=0;
tnuma=tnumb=0;
int lens=s.size(),lent=t.size();
for(int i=0;i<lens;++i)
{
if(s[i]=='a') snuma++;
else snumb++;
}
for(int j=0;j<lent;++j)
{
if(t[j]=='a') tnuma++;
else tnumb++;
}
//cout<<snuma<<' '<<snumb<<endl;
//cout<<tnuma<<' '<<tnumb<<endl;
snuma%=2; snumb%=2;
tnuma%=2; tnumb%=2;
//cout<<snuma<<' '<<snumb<<endl;
//cout<<tnuma<<' '<<tnumb<<endl;
if(snuma!=tnuma||snumb!=tnumb) return false;
else return true;
//}
}
int main()
{
while(cin>>s>>t)
{
int i=0,j=0;
int lens=s.size(),lent=t.size();
int flag=1;
int sc=0,tc=0;
for(int i=0;i<lens;++i)
{
if(s[i]=='c') sc++;
}
for(int j=0;j<lent;++j)
if(t[j]=='c') tc++;
if(sc!=tc)
{
cout<<"No"<<endl;
continue;
}
while(i<lens||j<lent) //这里如果写成&&就比较麻烦了
{
string tmps="",tmpt="";
while(i<lens&&s[i]!='c')
{
tmps+=s[i];
i++;
}
while(j<lent&&t[j]!='c')
{
tmpt+=t[j];
j++;
}
i++;
j++;
if(!judge(tmps,tmpt)) //以c为分割点一旦奇偶性发生变化就不行
{
cout<<"No"<<endl;
flag=0;
break;
}
}
if(flag) cout<<"Yes"<<endl;
}
return 0;
}