日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

洛谷 - P2444 - 病毒 - AC自动机

發布時間:2025/3/14 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷 - 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自动机的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。