标签:miss ant and ring names rac comm most ima
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 63090 Accepted Submission(s):
20917
/* AAC自动机模板 寻找字串在模式串中出现个数 */ #include<iostream> #include<cstdio> #include<cstring> #include<queue> #define N 500007 using namespace std; queue<int>q; int n,t,sz=1,len; int v[N],fail[N],trie[N][27]; char s[51],a[N*20]; bool mark[N]; void insert() { int root=1; for(int i=0;i<len;i++) { int id=s[i]-‘a‘+1; if(!trie[root][id]) trie[root][id]=++sz; root=trie[root][id]; } v[root]++; } void buildfail() { for(int i=1;i<=26;i++) trie[0][i]=1; q.push(1); while(!q.empty()) { int now=q.front(); for(int i=1;i<=26;i++) { if(!trie[now][i]) continue; q.push(trie[now][i]);int x=fail[now]; while(!trie[x][i]) x=fail[x]; fail[trie[now][i]]=trie[x][i]; } q.pop(); } } void work() { int root=1,ans=0; for(int i=0;i<len;i++) { int id=a[i]-‘a‘+1;mark[root]=true; while(!trie[root][id]) root=fail[root]; root=trie[root][id]; if(!mark[root])//每个点都找一遍 { int x=root; while(x) { ans+=v[x];v[x]=0;x=fail[x];//因为当前后缀等于比它深度浅的前缀,后缀有前缀一定有 } } }printf("%d\n",ans); } void init() { memset(v,0,sizeof(v));sz=1; memset(trie,0,sizeof(trie)); memset(fail,0,sizeof(fail)); memset(mark,0,sizeof(mark)); } int main() { scanf("%d",&t); while(t--) { init();scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%s",s); len=strlen(s); insert(); } buildfail(); scanf("%s",a);len=strlen(a); work(); } }
标签:miss ant and ring names rac comm most ima
原文地址:http://www.cnblogs.com/L-Memory/p/7039783.html