Codeforces —— 358B Dima and Text Messages

9 篇文章 0 订阅
8 篇文章 0 订阅
题目链接: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++

最后判断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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值