传送门:点击打开链接
题意:定义一次操作,可以在任意一个字符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"); } }