洛谷 - P2444 - 病毒 - AC自动机
生活随笔
收集整理的這篇文章主要介紹了
洛谷 - P2444 - 病毒 - AC自动机
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://www.luogu.org/problemnew/show/P2444
有點惡心,不太明白fail的意義。
#include<bits/stdc++.h> using namespace std; #define ll long longstruct Trie{int nex[60010][2],fail[60010],End[60010];int root,L;int newnode(){/*for(int i=0;i<26;i++)nex[L][i]=-1;*/End[L++]=0;return L-1;}int cnt;void init(){L=0;cnt=0;memset(nex,-1,sizeof(nex));root=newnode();}void insert(char buf[]){int len=strlen(buf);int now=root;for(int i=0;i<len;i++){int &t=nex[now][buf[i]-'0'];if(t==-1)t=newnode();now=t;}End[now]++;cnt++;}void build(){queue<int>Q;fail[root]=root;for(int i=0;i<2;i++){if(nex[root][i]==-1){nex[root][i]=root;//根節點沒有對應的分支,還是必須回到根節點開始匹配 }else{//根節點的后繼失配,先假定回到根節點匹配fail[nex[root][i]]=root;Q.push(nex[root][i]);}}while(!Q.empty()){int now=Q.front();Q.pop();for(int i=0;i<2;i++)if(nex[now][i]==-1){//某個節點沒有這個對應的分支,它失配了,沿著失配邊去到最近的有這個分支的邊?nex[now][i]=nex[fail[now]][i];}else{fail[nex[now][i]]=nex[fail[now]][i];Q.push(nex[now][i]);//如果這個節點的fail指針指向的點是End,那么因為這個節點蘊含他的fail節點,所以他也是EndEnd[now]|=End[fail[now]];}}}/*int query(char buf[]){int len=strlen(buf);int now=root;int res=0;for(int i=0;i<len;i++){now=nex[now][buf[i]-'0'];int temp=now;while(temp!=root&&End[temp]!=-1){res+=End[temp];End[temp]=-1;temp=fail[temp];}//if(res==cnt)//return res;}return res;}*/int vis[60005];int instack[60005];int find_circle(){memset(vis,0,sizeof(vis));memset(vis,0,sizeof(instack));return dfs(root);}int dfs(int id){instack[id]=1;vis[id]=1;for(int i=0;i<2;i++){if(instack[nex[id][i]]){//該節點的下一條邊在dfs棧中,是反向邊printf("TAK\n");exit(0);}if(vis[nex[id][i]]==0){//不訪問已經到過的表親,表親不可能成環if(End[nex[id][i]]==0){//下一個點不是病毒 dfs(nex[id][i]);}}}instack[id]=0;return 0;}};char buf[100010];Trie ac;int n; void solve(){while(~scanf("%d",&n)){if(n==0)break;ac.init();for(int i=0;i<n;i++){scanf("%s",buf);ac.insert(buf);}ac.build();//scanf("%s",buf);if(ac.find_circle()==0){cout<<"NIE"<<endl;}} }int main(){ #ifdef Yinkufreopen("Yinku.in","r",stdin);//freopen("Yinku.out","w",stdout); #endif // Yinkusolve(); }?
轉載于:https://www.cnblogs.com/Yinku/p/10538026.html
總結
以上是生活随笔為你收集整理的洛谷 - P2444 - 病毒 - AC自动机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 数据存储----andr
- 下一篇: 蒟蒻浅谈树链剖分之一——两个dfs操作