标签:打表 while row dde too 一个 fast fine class
2
a
aa
aa
2
#include<queue> #include<stdio.h> const int N=1e6+5; const int sz=26; int T,n,ans,cnt=1,now,p,fail[N],tag[N],tr[N][sz];char s[N<<1]; #define son (s[i]-‘a‘) void insert(){ now=1; for(int i=0;s[i];i++){ if(!tr[now][son]) tr[now][son]=++cnt; now=tr[now][son]; } tag[now]++; } std::queue<int>q; void acmatch(){ q.push(1); fail[1]=0; for(int i=0;i<sz;i++) tr[0][i]=1; while(!q.empty()){ now=q.front();q.pop(); for(int i=0;i<sz;i++){ if(!tr[now][i]) continue; for(p=fail[now];p&&!tr[p][i];p=fail[p]); fail[tr[now][i]]=p?tr[p][i]:1; q.push(tr[now][i]); } } } void solve(){ p=1; for(int i=0;s[i];i++){ for(;p&&!tr[p][son];p=fail[p]); p=p?tr[p][son]:1; for(int j=p;j&&~tag[j];j=fail[j]){ ans+=tag[j]; tag[j]=-1; } // -1 break to faster } printf("%d\n",ans); } #undef son int main(){ scanf("%d",&n); for(int i=0;i<n;i++) scanf("%s",s),insert(); acmatch(); scanf("%s",s); solve(); return 0; }
标签:打表 while row dde too 一个 fast fine class
原文地址:https://www.cnblogs.com/shenben/p/12675525.html