HDU 5414 CRB and String

题意:给两个字符串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)