码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 5414 CRB and String

时间:2015-08-20 20:57:31      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:

题意:给两个字符串a,b,问是否可以将a串变成b串。只有一种操作,即选择a串的一格字符c,在c后面添加一个字符d,要求d和c不同。操作可以进行很多次,也可以不进行。保证a,b非空且a的长度不过b的长度。

解法:(千万别想麻烦了)显然如果第一个字符不同,就无解;设两个指针t1,t2分别指向a,b,t1 t2 从0开始扫,发现不同则退出,发现s2[t2 - 1] != s2[t2] (t2 > 0) 则退出。。此时如果t2指向len2则有解,如果t2指向0则无解,如果s2[t2 - 1] == s2[t2]则无解,否则,判从t1开始的s1的后缀是否是从t2开始的s2的后缀的子序列。。没了。

My code

#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
#define N 100010
char s1[N],s2[N];
int lens1,lens2;
bool judge(){
    if(s1[0] != s2[0]) return false;
    int t1 = 0, t2 = 0;
    for(; t1 < lens1;){
        if(t2 > 0 && s2[t2 - 1] != s2[t2]) break;
        if(s1[t1] != s2[t2]) break;
        t1++, t2++;
    }
    if(t2 == lens2) return true;
    if(t2 == 0) return false;
    if(s2[t2 - 1] == s2[t2]) return false;
    for(; t1 < lens1 && t2 < lens2;){
        if(s1[t1] == s2[t2]) t1++;
        t2++;
    }
    if(t1 == lens1) return true;
    else return false;
}
int main(){
    int T;
    scanf("%d",&T);
    for(int kase = 1; kase <= T; kase++){
        scanf("%s%s",s1,s2);
        lens1 = (int)strlen(s1), lens2 = (int)strlen(s2);
        printf("%s\n",judge()?"Yes":"No");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU 5414 CRB and String

标签:

原文地址:http://blog.csdn.net/uestc_peterpan/article/details/47813479

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!