AC自动机模板(摘自刘汝佳紫书,无指针)
生活随笔
收集整理的這篇文章主要介紹了
AC自动机模板(摘自刘汝佳紫书,无指针)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本題的題目選擇的是
病毒侵襲持續中
?HDU - 3065?
const int size=5e4+5; const int SIGMA_SIZE=26; int trie[size][26],val[size]; char s_save[1005][60],s_fin[2000005]; int f[size]; int last[size]; int tot=1; int sum[1005]; void init() {memset(trie,0,sizeof(trie));memset(val,0,sizeof(val));memset(f,0,sizeof(f));tot=1;memset(sum,0,sizeof(sum)); } void cal(int j) {if(j){sum[val[j]]++;cal(last[j]);} } void insert(int v,char *s_ins) {int len=strlen(s_ins);int root=0;for(int i=0;i<len;i++){int id=s_ins[i]-'A';if(!trie[root][id]){ memset(trie[tot],0,sizeof(trie[tot]));val[tot]=0; trie[root][id]=tot++;}root=trie[root][id];}val[root]=v; } void query() {int len=strlen(s_fin);int j=0;for(int i=0;i<len;i++){if(s_fin[i]<'A'||s_fin[i]>'Z'){j=0;continue;} int id=s_fin[i]-'A';while(j&&!trie[j][id]) j=f[j];j=trie[j][id];if(val[j]) cal(j);else if(last[j]) cal(last[j]);} }void getFail() {queue<int> q;f[0]=0;for(int c=0;c<SIGMA_SIZE;c++){int u=trie[0][c];if(u) {f[u]=0;q.push(u);last[u]=0;} }while(!q.empty()){int r=q.front();q.pop();for(int c=0;c<SIGMA_SIZE;c++){int u=trie[r][c];if(!u){trie[r][c]=trie[f[r]][c];continue;}q.push(u);int v=f[r];f[u]=trie[v][c];last[u]=val[f[u]]?f[u]:last[f[u]];}} }轉載于:https://www.cnblogs.com/fly-white/p/10092746.html
總結
以上是生活随笔為你收集整理的AC自动机模板(摘自刘汝佳紫书,无指针)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Express对mysql进行增改查
- 下一篇: C# Semaphore