题目链接:http://codeforces.com/problemset/problem/358/B
题目的意思是,前面N个字符串,首先在这些字符串中间插入“<3”,最前面和最后面也插入“<3”,得到新的字符串S,然后给出另一个字符串T,判断前者通过插入一些随机字符,是否能够得到后者。
首先先按要求构造出S。
这里让我体会到了sprintf的慢了。。。用sprintf到了第10组数据就T掉了。。。老老实实一个个赋值过去。。。不知道用string怎么样,没试过。
POJ上有个简化的版本:http://poj.org/problem?id=1936
POJ的题目就是省去了这道题构造S的过程,后面的做法是一样的。
从第一个字符开始扫T,同时另一个i指向S的第一个字符,然后遇到跟s[i]一样的就i++
题目的意思是,前面N个字符串,首先在这些字符串中间插入“<3”,最前面和最后面也插入“<3”,得到新的字符串S,然后给出另一个字符串T,判断前者通过插入一些随机字符,是否能够得到后者。
首先先按要求构造出S。
这里让我体会到了sprintf的慢了。。。用sprintf到了第10组数据就T掉了。。。老老实实一个个赋值过去。。。不知道用string怎么样,没试过。
POJ上有个简化的版本:http://poj.org/problem?id=1936
POJ的题目就是省去了这道题构造S的过程,后面的做法是一样的。
从第一个字符开始扫T,同时另一个i指向S的第一个字符,然后遇到跟s[i]一样的就i++
最后判断i是否到达S的结尾就能知道是否匹配完了。
#include<cstdio>
#include<cstring>
char s[400010], tmp[100010], t[100010];
bool f1, f2;
int n, m, l, i, j;
int main(){
while(~scanf("%d", &n)){
s[0]='<';
s[1]='3';
m=2;
for(i=0; i<n; i++){
scanf("%s", tmp);
l = strlen(tmp);
for(j=0;j<l;j++) s[m++]=tmp[j];
s[m++]='<';
s[m++]='3';
}
scanf("%s", t);
l = strlen(t);
if(m>l){
puts("no");
continue;
}
for(i=0,j=0; i<m&&j<l; j++){
if(s[i]==t[j]){
i++;
}
}
if(i==m) puts("yes");
else puts("no");
}
return 0;
}