http://acm.hdu.edu.cn/showproblem.php?pid=5414
题意:给定字符串s和t,可以在s里面选一个字符c,然后任选一个字符d(d!=c)将d插入到c的后面,问能不能将s变为t。
分析:只要前面t串连续的字符==s字符串,而且保证s是t的子串。本来想不通s:aabaa,t:aabaaaa,后面四个a怎么插,后来才想明白,后面的a都可以插在b后面,就可以了。
CRB and String
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 676 Accepted Submission(s):
256
Problem Description
CRB has two strings s
and t
.
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?
In each step, CRB can select arbitrary character c
CRB wants to convert s
Input
There are multiple test cases. The first line of input
contains an integer T
, indicating the number of test cases. For each test case there are two strings
s
and t
, one per line.
1 ≤ T
≤ 10
5![]()
1 ≤ |s|
≤ |t|
≤ 10
5![]()
All strings consist only of lowercase English letters.
The size of each input file will be less than 5MB.
1 ≤ T
1 ≤ |s|
All strings consist only of lowercase English letters.
The size of each input file will be less than 5MB.
Output
For each test case, output "Yes" if CRB can convert s
to t, otherwise output "No".
Sample Input
4
a
b
cat
cats
do
do
apple
aapple
Sample Output
No
Yes
Yes
No
Author
KUT(DPRK)
Source
#include<iostream> #include<cstdio> #include<cstring> using namespace std; char s[100005],t[100005]; int main() { int r; scanf("%d",&r); getchar(); while(r--) { int i,j; scanf("%s",s); scanf("%s",t); int len1=strlen(s); int len2=strlen(t); int flag=1; for(i=1;i<len2;i++) if(t[i]!=t[0]) break;//找到t串的第一个不连续的位置 for(j=0;j<i;j++)//看s的前i个子串是否连续 if(s[j]!=t[j]) { flag=0; break; } j=i; for(;j<len1;j++) { for(;i<len2;i++) {//找到下一个和s相等的地方 if(t[i]==s[j]) break; } if(i==len2) { flag=0; break ;//如果t找完了还没跳出证明s不是t的子串 } i++; } if(s[0]!=t[0]) flag=0; if(flag) printf("Yes "); else printf("No "); } return 0; }