CRB and String
In each step, CRB can select arbitrary character c of s and insert any character d ( d≠c ) just after it.
CRB wants to convert s to t . But is it possible?
1 ≤ T ≤ 105
1 ≤ |s| ≤ |t| ≤ 105
All strings consist only of lowercase English letters.
The size of each input file will be less than 5MB.
4 a b cat cats do do apple aapple
No Yes Yes No
题意:给你两个字符串s和t,你可以在字符串s中任意选一个字符c,在该字符c后插入一个字符d(d!=c),问经过多次此操作,能否将字符串s转化成字符串t
放上出题人的解题报告
解题思路:首先拿到这样的题目,我们当然是来找找怎么样的s是能够转化成t的,经过举例,我们可以得到如下两个条件
①字符串s是字符串t的子串,即t是包含s的字符串,比如说s=cat t=cbadt
②若字符串t前k个字符都相同,那么字符串s的前k个字符也必须相同,比如说 s=aabcd t=aabcde 是可以转化的,而s=aabcd t=aaabcd 则是不可以转化的,因为我们没有办法在a后面插入a,因为题目要求插入的字符d!=选择的字符c
只要符合上述两个条件的字符串s,都可以转化成字符串t
这个时候有些人会疑问,难道后面有不等长的字符串就可以转化了?比如说 s=apple t=appple
虽说我们没办法在p字符后面插入p,但是我们可以在a字符后面插入p,这样我们就可以做到s转化成t了
放上几组样例以供参考
Input
b
ab
Output
No
Input
apple
appapple
Output
Yes
Input
apple
appple
Output
Yes
Input
aa
aaa
Output
No
说了这么多,剩下的靠你们理解咯,老样子,不理解的欢迎提出来
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<stdlib.h>
#include<cmath>
#include<string>
#include<algorithm>
#include<iostream>
#define exp 1e-10
using namespace std;
const int N = 100005;
const int inf = 1000000000;
const int mod = 1000000007;
char s[N],t[N];
int main()
{
int T,i,j,k;
scanf("%d",&T);
while(T--)
{
scanf("%s%s",s,t);
for(k=i=j=0;t[i]!='\0';i++)
{
if(!k&&t[i]==t[0]&&s[i]!=t[0])//t的前k个字符相等,那么s的前k个字符也必须相等
break;
if(t[i]!=t[0])
k=1;
if(s[j]!='\0'&&t[i]==s[j])//s是t的子串
j++;
}
if(t[i]=='\0'&&s[j]=='\0')
puts("Yes");
else
puts("No");
}
return 0;
}
菜鸟成长记