HDU-2778 DNA Sequence(AC自动机)

时间:2022-06-02 13:01:26

题目大意:统计模式串出现的次数。

题目分析:模板题。

代码如下:

# include<iostream>
# include<cstdio>
# include<queue>
# include<string>
# include<cstring>
# include<algorithm>
using namespace std; const int N=1000; int cnt;
int ch[N*50+5][95];
int f[N*50+5];
int val[N*50+5];
char p[N][55];
int num[N+5];
char str[N*N*10+5]; void init()
{
cnt=0;
memset(ch,0,sizeof(ch));
memset(val,0,sizeof(val));
memset(num,0,sizeof(num));
} int idx(char c)
{
return (int)(c-32);
} void insert(char *s,int id)
{
int r=0;
int m=strlen(s);
for(int i=0;i<m;++i){
int c=idx(s[i]);
if(!ch[r][c]) ch[r][c]=++cnt;
r=ch[r][c];
}
val[r]=id;
} void getFail()
{
queue<int>q;
f[0]=0;
for(int i=0;i<95;++i){
int u=ch[0][i];
if(u){
f[u]=0;
q.push(u);
}
}
while(!q.empty())
{
int r=q.front();
q.pop();
for(int i=0;i<95;++i){
if(ch[r][i]){
f[ch[r][i]]=ch[f[r]][i];
q.push(ch[r][i]);
}else ch[r][i]=ch[f[r]][i];
}
}
} void ac(char *str)
{
int j=0;
int len=strlen(str);
for(int i=0;i<len;++i){
j=ch[j][idx(str[i])];
int u=j;
while(u){
if(val[u]) ++num[val[u]];
u=f[u];
}
}
} int main()
{
int n;
while(~scanf("%d",&n))
{
init();
for(int i=0;i<n;++i){
cin>>p[i];
insert(p[i],i+1);
}
getFail();
scanf("%s",str);
ac(str);
for(int i=1;i<=n;++i) if(num[i]>0)
printf("%s: %d\n",p[i-1],num[i]);
}
return 0;
}