日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > HDU 2222 Keywords Search (初學AC自動機)

HDU 2222 Keywords Search (初學AC自動機)

來源:程序員人生   發布時間:2015-03-28 08:17:03 閱讀次數:2539次

我是通過http://wenku.baidu.com/view/4e70ccc38bd63186bcebbcb9.html的第2篇學會的

這篇也總結的很好,附帶很多經典的習題http://www.cppblog.com/menjitianya/archive/2014/07/10/207604.html

這是bin神的總結:http://www.cnblogs.com/kuangbin/p/3164106.html


這是kss的板子:http://paste.ubuntu.com/10499866/

這個板子用了tire圖的優化,即不需要失配回溯,效力大大提高


本題代碼:

普通模版:

//826MS 28308K #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; #define MAXN 500500 #define M 1001000 char s[55]; char desc[M]; struct node{ node *next[26]; node *fail; int cnt; }tire[MAXN],*que[MAXN],*root; struct AC { int L,head,tail; node *createnode(){ memset(tire[L].next,0,sizeof(tire[L].next)); tire[L].fail=NULL; tire[L].cnt=0; return &tire[L++]; } void ini(){ L=head=tail=0; root=createnode(); } void Insert(char str[]){ node *cur=root; for(int i=0;str[i];i++){ int val=str[i]-'a'; if(!cur->next[val]){ cur->next[val]=createnode(); } cur=cur->next[val]; } cur->cnt++; } void build(){ que[head++]=root; while(tail<head){ node *cur=que[tail++]; for(int i=0;i<26;i++){ if(cur->next[i]!=NULL){ node *tmp=cur; tmp=tmp->fail; while(tmp!=NULL){ if(tmp->next[i]!=NULL){ cur->next[i]->fail=tmp->next[i]; break; } tmp=tmp->fail; } if(tmp==NULL) cur->next[i]->fail=root; que[head++]=cur->next[i]; } } } } int query(char str[]){ int ans=0; node *cur=root; for(int i=0;str[i];i++){ int val=str[i]-'a'; while(cur!=root&&cur->next[val]==NULL) cur=cur->fail; cur= cur->next[val]; cur=(cur==NULL) ? root:cur; node *tmp = cur; while(tmp!=root){ ans+=tmp->cnt; tmp->cnt=0; tmp=tmp->fail; } } return ans; } }ac; int main(){ int T; scanf("%d",&T); while(T--){ ac.ini(); int m; scanf("%d",&m); while(m--){ scanf("%s",s); ac.Insert(s); } ac.build(); scanf("%s",desc); printf("%d ",ac.query(desc)); } return 0; }

tire圖優化模版:(可見效力提高了很多)

//249MS 28308K #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; #define MAXN 500500 #define M 1001000 char s[55]; char desc[M]; struct node{ node *next[26]; node *fail; int cnt; }trie[MAXN],*que[MAXN],*root; struct AC{ int head,tail,L; node* createnode(){ trie[L].fail=NULL; memset(trie[L].next,0,sizeof(trie[L].next)); trie[L].cnt=0; return &trie[L++]; } void ini(){ head=tail=L=0; root=createnode(); } void Insert(char str[]){ node *cur=root; for(int i=0;str[i];i++){ int val=str[i]-'a'; if(cur->next[val]==NULL) cur->next[val]=createnode(); cur=cur->next[val]; } cur->cnt++; } void build(){ que[head++]=root; while(head>tail){ node *cur=que[tail++]; for(int i=0;i<26;i++){ if(cur->next[i]!=NULL){ if(cur==root) cur->next[i]->fail=root; else cur->next[i]->fail=cur->fail->next[i]; que[head++]=cur->next[i]; } else { if(cur==root) cur->next[i]=root; else cur->next[i] = cur->fail->next[i]; } } } } int query(char str[]){ int ans=0; node *cur=root; for(int i=0;str[i];i++){ int val=str[i]-'a'; cur=cur->next[val]; if(cur->cnt){ node *tmp=cur; while(tmp!=root){ ans+=tmp->cnt; tmp->cnt=0; tmp=tmp->fail; } } } return ans; } }ac; int main(){ int T; scanf("%d",&T); while(T--){ ac.ini(); int m; scanf("%d",&m); while(m--){ scanf("%s",s); ac.Insert(s); } ac.build(); scanf("%s",desc); printf("%d ",ac.query(desc)); } return 0; }



生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 成人在线观看视频网站 | 日韩中文字幕久久 | 欧美综合视频 | 东北寡妇特级毛片免费 | 二区av| 亚洲视频黄色 | 欧美日韩在线电影 | 99久久精品国产毛片 | 成人欧美一区二区三区在线观看 | aaa日本高清在线播放免费观看 | 91久久久久久久久久久 | 狼人综合视频 | 日韩精品不卡 | 久久国产精品一区二区三区 | 1000部精品久久久久久久久 | 成人av中文字幕 | 国产精品久久久久永久免费观看 | 一级二级在线观看 | 美日韩精品视频 | 四季久久免费一区二区三区四区 | 亚洲成人久久久 | 国产精品网站在线观看 | 污视频在线| 国产精品久久久久久久久久尿 | 久久久免费精品视频 | 国产做爰免费视频观看 | 麻豆日韩 | 国产福利片在线 | 国产91在线播放 | 欧美日本精品 | 亚洲电影免费 | 日韩欧美中文字幕在线观看 | 国产精品黄| 色婷婷综合久久久中文字幕 | 欧美理论在线观看 | 日韩国产精品久久久久久亚洲 | 精品国产污污免费网站精东 | 久久激情av | 最新国产精品精品视频 | 午夜视频免费看 | 亚洲精品乱码久久久久久蜜桃 |