洛谷 P3121 [USACO15FEB]审查(黄金)Censoring (Gold) 【AC自动机+栈】
2018-05-09 11:46
489 查看
这个和bzoj同名题不一样,有多个匹配串
但是思路是一样的,写个AC自动机,同样是开两个栈,一个存字符,一个存当前点在trie树上的位置,然后如果到了某个匹配串的末尾,则弹栈
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int N=100005; int n,t ,top; char a ,b ,s ; struct AC { int tot,c [27],f ,l ; void ins(char s[]) { int len=strlen(s),nw=0; for(int i=0;i<len;i++) { if(!c[nw][s[i]-'a']) c[nw][s[i]-'a']=++tot; nw=c[nw][s[i]-'a']; } l[nw]=len; } void build() { queue<int>q; for(int i=0;i<26;i++) if(c[0][i])//!!!!!!!!!!!!!!!!!!!!!!!!!!! f[c[0][i]]=0,q.push(c[0][i]); while(!q.empty()) { int u=q.front(); q.pop(); for(int i=0;i<26;i++) { if(c[u][i]) f[c[u][i]]=c[f[u]][i],q.push(c[u][i]); else c[u][i]=c[f[u]][i]; } } } void wk(char a[]) { int len=strlen(a),nw=0; for(int i=0;i<len;i++) { nw=c[nw][a[i]-'a']; s[++top]=a[i],t[top]=nw; if(l[nw]) top-=l[nw],nw=t[top]; } for(int i=1;i<=top;i++) putchar(s[i]); } }ac; int main() { scanf("%s%d",a,&n); for(int i=1;i<=n;i++) { scanf("%s",b); ac.ins(b); } ac.build(); ac.wk(a); return 0; }
相关文章推荐
- P3121 [USACO15FEB]审查(黄金)Censoring (Gold)
- AC自动机-洛谷3121 [USACO15FEB]审查(黄金)Censoring (Gold)
- [USACO15FEB]审查(黄金)Censoring (Gold)
- LuoguP3121 [USACO15FEB]审查(黄金)Censoring (Gold)【Hash做法】By cellur925
- 【USACO15FEB】审查(黄金)Censoring (Gold)
- [USACO15FEB]审查(黄金)Censoring (Gold)
- [Luogu3121][USACO15FEB]审查Censoring
- [BZOJ3940][Usaco2015 Feb]Censoring(AC自动机+栈)
- Luogu P3120 [USACO15FEB]牛跳房子(金)Cow Hopscotch (Gold)
- BZOJ[3940][Usaco2015 Feb]Censoring(Gold) AC自动机
- 洛谷P3120 [USACO15FEB]Cow Hopscotch
- 洛谷P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold
- [USACO13DEC]假期计划(黄金)Vacation Planning (gold)
- [USACO13DEC]假期计划(黄金)Vacation Planning (gold)
- 洛谷P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold
- [USACO07MAR]黄金阵容均衡Gold Balanced L…(洛谷 1360)
- 洛谷P1360 [USACO07MAR]黄金阵容均衡Gold Balanced L…
- [USACO13DEC]假期计划(黄金)Vacation Planning (gold)
- 洛谷P1948 [USACO08JAN]电话线Telephone Lines
- POJ 3269 USACO FEB GOLD newbarn