bzoj1212 L语言 递推&Tire

来源:互联网 发布:阿里云国际 信用卡 编辑:程序博客网 时间:2024/06/06 09:53

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

AC代码如下:

#include<iostream>#include<cstdio>#include<cstring>#define N 1300005using 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


0 0