bzoj1212 L语言 递推&Tire

    这道题目写得好暴力可能都能过吧(←乱说的别理他( ̄_, ̄ ))。大概用Tire做到O(N*len),其中len表示一个单词的长度。实际上也非常好写,如果用刷表法也就30行代码。。一不小心把Tire开大了MLE了一下然后差点刷到第一页(←这也能拿出来说,就这点出息)。

AC代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 1300005
using namespace std;

int n,m,tot,len,ch[305][26]; bool bo[N],f[N]; char s[N];
void updata(int x){
	int now=ch[0][s[x]-'a'];
	for (; now; now=ch[now][s[++x]-'a']){	if (bo[now]) f[x]=1; if (x==len) return; }
}
int main(){
	scanf("%d%d",&n,&m); int i,j;
	for (i=1; i<=n; i++){
		scanf("%s",s); int now=0;
		for (j=0; s[j]; j++){
			int x=s[j]-'a'; if (!ch[now][x]) ch[now][x]=++tot;
			now=ch[now][x];
		}
		bo[now]=1;
	}
	for (i=1; i<=m; i++){
		scanf("%s",s+1); len=strlen(s+1); int t=0,ans;
		memset(f,0,sizeof(f)); f[0]=1;
		for (j=0; j<=len; j++){
			if (t>10) break;	if (!f[j]){ t++; continue; }
			t=0; ans=j; updata(j+1);
		}
		printf("%d\n",ans);
	}
	return 0;
}

by lych

2016.2.6


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值