2018CCPC中国大学生程序设计竞赛全国邀请赛(湖南)----hdu 6282--G.String Transformation

题意:给两个串,s和t(只包含a,b,c三种字母),可以对串进行删除或者增加 aa,bb,abab.的操作。问是否能把s串变成t串。

思路:首先,c无法增加和删除,所以只需要考虑c的数量相同和两个c之间的ab串是否匹配。由题意可知  1、aa,bb,abab,等价于空串,空串等价这三个串。2、其次   ab可推出ba,反之也行。3、a => bab=>abb,右边可以无限加两个b。4、a=>bab=>bba,同理左边可以无限加两个b。5、b=>aba=>aab,左边无限加两个a。6、b=>aba=>baa,右边无限加两个aa。所以我们得知,如果s串是奇数个b或者a,那么必定t串也是奇数个b或者a,所以,只要考虑两个c之间的a,b,的奇偶是否相同就行了。代码如下:

#include <stdio.h>
#include <string.h>
#include <iostream>

using namespace std;
const int maxn = 1e4+100;
char s[maxn],t[maxn];

int main(){
    while(~scanf("%s\n%s",s,t)){
        bool flag = true;
        int n = strlen(s);
        int m = strlen(t);
        s[n] = 'c';
        s[n+1]='\0';
        t[m]='c';
        t[m+1]='\0';
        ++n,++m;
        int Sa = 0,Sb = 0;
        int Ta = 0,Tb = 0;
        int i=0,j=0;
        while(i<n&&j<m){
            Sa=0,Sb=0;
            Ta=0,Tb=0;
            while(s[i]!='c'&&s[i]!='\0'){
                if(s[i] == 'a') ++Ta;
                else ++Tb;
                ++i;
            }
            if(s[i]!='\0')
            ++i;
            while(t[j]!='c'&&t[j]!='\0'){
                if(t[j]=='a') ++Ta;
                else ++Tb;
                ++j;
            }
            if(t[j]!='\0')
            ++j;
            if(Sa%2!=Ta%2||Sb%2!=Tb%2){
                flag = false;
                break;
            }
        }
      //  cout<<i<<" "<<j<<endl;
        if(i==n&&j==m&&flag){
            puts("Yes");
        }
        else{
            puts("No");
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值