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