模拟 hdu5414 CRB and String

传送门:点击打开链接

题意:定义一次操作,可以在任意一个字符a后面插入一个不等于a字符的任意字符。问是否能将s串变成t串

思路:感觉这种构造和模拟的题目做少了Orz

首先我们可以发现,如果是开头,第一个字符必须要一样,设第一个字符为f

那么前面连续的如果两个都等于f,就把指针都后移,直到两个中的某一个指针到末了,或者两者不再相等,才跳出循环

然后判断是否是指针到末端了,对于i和j到末端的判断不一样,需要仔细判断一下。

然后如果两者现在不相等,也不能有B[j] == f.因为B[j]是无法在f后面插入的,因为两者一样


然后终于把特殊情况全部考虑完了~

处理到这里后,后面的部分完全可以认为是可以插入在任意一个字符a后面插入任意一个字符包括字符a,因为在插入位置的前面绝对会存在不是a字符的,只要在那里插入a字符就能够达到效果并满足题意。所以后面的部分就很好模拟了

#include<map>
#include<set>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#define FIN freopen("input.txt","r",stdin)
#define FOUT freopen("output.txt","w+",stdout)

using namespace std;
typedef long long LL;
typedef pair<int, int> PII;

const int MX = 1e5 + 5;

char A[MX], B[MX];

bool solve(char *A, char *B) {
    if(A[0] != B[0]) return false;

    int f = A[0];
    int m = strlen(A), n = strlen(B), i = 1, j = 1;
    while(i < m && j < n && A[i] == B[j] && A[i] == f) i++, j++;
    if(j == n) return i == m;
    if(i == m) return B[j] != f;
    if(B[j] == f) return false;

    while(true) {
        if(i == m) return true;
        if(j == n) return false;

        if(A[i] == B[j]) i++, j++;
        else j++;
    }
}

int main() {
    int T;//FIN;
    scanf("%d", &T);
    while(T--) {
        scanf("%s%s", A, B);
        printf("%s\n", solve(A, B) ? "Yes" : "No");
    }
}


你可能感兴趣的:(模拟 hdu5414 CRB and String)