HDU2896 病毒侵袭
生活随笔
收集整理的這篇文章主要介紹了
HDU2896 病毒侵袭
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目傳送門
AC自動機第一題~
一看就是一個非常簡單的多串匹配問題了,輸出方案?記錄一下就好了
注意這里code是Trie圖,它是AC自動機的改進版本,有效利用了原本無用的邊,這反而簡化了代碼
#include<queue> #include<stdio.h> #include<string.h> #include<algorithm> #define N 100010 using namespace std; char s[N]; int fail[N],son[N][128],c[N],cnt=1,n,T=0; inline void insert(char* s,int pos){int x=1;for(;*s;++s)x=son[x][*s]?son[x][*s]:son[x][*s]=++cnt;c[x]=pos; } inline void build(){queue<int> q;for(int i=0;i<128;++i)if(!son[1][i]) son[1][i]=1;else q.push(son[1][i]),fail[son[1][i]]=1;for(int x;!q.empty();q.pop()){x=q.front();for(int i=0;i<128;++i)if(!son[x][i]) son[x][i]=son[fail[x]][i];else q.push(son[x][i]),fail[son[x][i]]=son[fail[x]][i];} } inline bool query(char* s){bool vis[510]={0},v=0;for(int x=1;*s;++s){x=son[x][*s];for(int j=x;j!=1;j=fail[j])if(c[j]) vis[c[j]]=v=1;}if(!v) return 0;printf("web %d:",T);for(int i=1;i<=n;++i) if(vis[i]) printf(" %d",i);puts(""); return 1; } int __18520(){if(scanf("%d",&n)<0) return 0; for(int i=1;i<=n;++i){scanf("%s",s); insert(s,i);}build(); int ans=0,m; scanf("%d",&m); for(T=1;T<=m;++T){scanf("%s",s); ans+=query(s);}printf("total: %d\n",ans); return cnt=1; } int main(){ while(__18520()); }
轉載于:https://www.cnblogs.com/Extended-Ash/p/9477189.html
總結
以上是生活随笔為你收集整理的HDU2896 病毒侵袭的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于爬虫异步请求心得
- 下一篇: C#实现发送手机短信