CCPC 2018 湖南全国邀请赛 hdu 6282 String Transformation

题意:可以在字符串任意位置增删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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值