【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


你可能感兴趣的:(tire,递推)