1. 程式人生 > >【HDOJ 5384】Danganronpa

【HDOJ 5384】Danganronpa

href 這不 i++ div 代碼 can .cn emp else

【HDOJ 5384】Danganronpa

AC自己主動機。

。。

當時感覺用字典樹 標神也往自己主動機想來著。。手太生加上時間緊迫也沒敲……回來一看題解什麽AB同一時候建自己主動機。。。頓時楞了 什麽叫同一時候建= =問了問財神說普通自己主動機。

。B串單建 立刻瘋了……這不就是模板題麽。。

。 B串建自己主動機 A串枚舉查詢 寫完興沖沖1T……立刻想法優化 建fail時壓縮一下 查詢時直接累計 不再循環找fail 171ms。。

。第二個自己主動機的題。。距上次蠻久了 這次一復習 感覺印象差點兒相同有了

代碼(模板)例如以下:

#include <iostream>
#include <cstdio> #include <cstdlib> #include <cstring> #include <queue> using namespace std; typedef struct Node { int ch[26],cnt,fail; }Node; Node tr[2600011]; char a[100001][10002]; int tp; int SetNode() { memset(tr[tp].ch,-1,sizeof(tr[tp].ch)); tr[tp].cnt = 0; return
tp++; } void Add(int site,char *str) { int i,k; for(i = 0; str[i]; ++i) { k = tr[site].ch[str[i] - ‘a‘]; if(k == -1) tr[site].ch[str[i] - ‘a‘] = k = SetNode(); site = k; } tr[site].cnt++; } void Build_AC(int site) { queue <int> q; q.push(site); int
i,tmp; while(!q.empty()) { site = q.front(); q.pop(); for(i = 0; i < 26; ++i) { if(tr[site].ch[i] == -1) continue; if(!site) tr[tr[site].ch[i]].fail = 0; else { tmp = tr[site].fail; while(tmp && tr[tmp].ch[i] == -1) tmp = tr[tmp].fail; tr[tr[site].ch[i]].fail = (tr[tmp].ch[i] == -1)? tmp: tr[tmp].ch[i]; if(tr[tmp].ch[i] != -1) ///壓縮計數器 tr[tr[site].ch[i]].cnt += tr[tr[tmp].ch[i]].cnt; } q.push(tr[site].ch[i]); } } } int Search(int site,char *str) { int i,k,ans = 0; for(i = 0; str[i]; ++i) { k = str[i] - ‘a‘; while(site && tr[site].ch[k] == -1) site = tr[site].fail; if(tr[site].ch[k] != -1) site = tr[site].ch[k]; ans += tr[site].cnt; } return ans; } int main() { int t,na,nb,i; char str[100005]; scanf("%d",&t); while(t--) { scanf("%d %d",&na,&nb); tp = 0; SetNode(); for(i = 0; i < na; ++i) { scanf("%s",a[i]); } while(nb--) { scanf("%s",str); Add(0,str); } Build_AC(0); for(i = 0; i < na; ++i) { printf("%d\n",Search(0,a[i])); } } return 0; }

【HDOJ 5384】Danganronpa