您的位置:首页 > 其它

ZSTU 3719 AC自动机DP

2012-04-04 15:23 246 查看
先mark,题目刷的差不多再说

View Code

#include<cstdio>
#include<cstring>
#define FF(i,to) for(i=0;i<to;i++)
const int MM = 1000005,NC = 26;
int N;
char str[1000005];
struct trie{
int ch[NC],fail,f,val;
void init(){
memset(ch,0,sizeof(ch));
fail=f=val=0;
}
}a[MM];
int cnt,rt,q[MM],front,last;
void Init(){
cnt=1;rt=cnt++;
a[0].init();int i;
FF(i,NC)    a[0].ch[i]=rt;
a[1].init();
}
void Ins(char *in){
int now=rt;
for(;*in;++in){
int id=*in-'a';
if(!a[now].ch[id]){
a[cnt].init();
a[now].ch[id]=cnt++;
}
now=a[now].ch[id];
}
a[now].f=1;
}
#define max(a,b) ((a)>(b)?(a):(b))
void build(int &ans){
front=last=0;
q[front++]=rt;
int i;
while(last<front){
int t=q[last++];
FF(i,NC){
int tt=a[t].ch[i];
int ff=a[t].fail;
if(tt){
a[tt].fail=a[ff].ch[i];
a[tt].val=max(a[t].val,a[a[ff].ch[i]].val)+a[tt].f;
q[front++]=tt;
}
else  a[t].ch[i]=a[ff].ch[i];
}
}
FF(i,cnt) ans=max(ans,a[i].val);
}
int main(){
int n,i;
while(scanf("%d",&n),n){
Init();
FF(i,n){
scanf("%s",str);
Ins(str);
}
int ans=0;
build(ans);
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: