题目大意:统计模式串出现的次数。
题目分析:模板题。
代码如下:
# 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; }
时间: 2024-10-15 21:07:17