模拟 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");
    }
}


posted @ 2017-08-20 15:08  jzdwajue  阅读(133)  评论(0编辑  收藏  举报