hdu2896 Ac自动机
2017-05-25 13:53
267 查看
ac自动机模版题吧
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m,ans,id[505],vis[105000]; char s[255],T[10005]; struct node{ int a[105000][128],fail[105000],danger[105000],sum,q[105000]; void insert(int x){ int k=0,L=strlen(s); for(int i=0;i<L;i++){ int now=s[i]; if(!a[k][now]) a[k][now]=++sum; k=a[k][now]; } danger[k]++; id[x]=k; } void get_fail(){ int head=0,tail=0; for(int i=0;i<128;i++){ int now=a[0][i]; if(now) q[tail++]=now; } while(head!=tail){ int x=q[head++]; for(int i=0;i<128;i++){ int now=a[x][i]; if(!now){a[x][i]=a[fail[x]][i]; continue;} q[tail++]=now; fail[now]=a[fail[x]][i]; } } } void push_ans(int x){ int L=strlen(T),k=0,f=0; memset(vis,0,sizeof(vis)); for(int i=0;i<L;i++){ int now=T[i]; k=a[k][now]; for(int j=k;j;j=fail[j]) if(danger[j]){vis[j]=1; f=1;} } if(!f) return ; ans++; printf("web %d:",x); for(int i=1;i<=n;i++) if(vis[id[i]]) printf(" %d",i); printf("\n"); } }node; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%s",s),node.insert(i); node.get_fail(); scanf("%d",&m); for(int i=1;i<=m;i++) scanf("%s",T),node.push_ans(i); printf("total: %d\n",ans); return 0; }View Code
相关文章推荐
- hdu2896 AC自动机
- HDU2896,ac自动机模板题
- HDU2896-AC自动机
- 【AC自动机】 hdu2896 病毒侵袭
- HDU2896(病毒侵袭--AC自动机)
- HDU2896 病毒侵袭[AC自动机]
- [hdu2896] 病毒侵袭 AC自动机
- hdu2896-ac自动机
- hdu2896(病毒侵袭)--AC自动机
- 【AC自动机】[HDU2896]病毒侵袭
- HDU2896【AC自动机-模板】
- hdu2896 病毒侵袭 ac自动机
- AC自动机(2)--hdu2896(病毒侵袭)(基础题)
- 【hdu2896】【AC自动机】病毒侵袭
- AC自动机(模板题)hdu2896
- hdu2896 AC自动机
- HDU2896[病毒侵袭] AC自动机
- hdu2896 病毒侵袭 AC自动机入门题 N(N <= 500)个长度不大于200的模式串(保证所有的模式串都不相同), M(M <= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串,
- hdu2896(AC自动机模板)
- hdu2896 AC自动机