【模板】AC自动机
2016-04-30 12:28
239 查看
参考lrj白书
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int N=1000010; char S ,SS ;int n; struct AC{ queue<int>q; int ch [27]; int f ,last ,cnt ; int ans; int idx(char c){return c-'a'+1;} int size,now; void insert(char* ss){ now=0; for(int i=0;ss[i];i++){ if(!ch[now][idx(ss[i])]) ch[now][idx(ss[i])]=++size; now=ch[now][idx(ss[i])]; } cnt[now]++; } void getfail(){ for(int i=1;i<=26;i++) if(ch[0][i]) q.push(ch[0][i]); while(!q.empty()){ int r=q.front();q.pop(); for(int i=1;i<=26;i++){ int u=ch[r][i]; if(!u) {ch[r][i]=ch[f[r]][i];continue;} q.push(u); int v=f[r]; while(v && !ch[v][i]) v=f[v]; f[u]=ch[v][i]; last[u]=cnt[f[u]]?f[u]:last[f[u]]; } } } void calc(int x){ if(x==0) return; ans+=cnt[x];cnt[x]=0;calc(last[x]); } void find(char *s){ int j=0; for(int i=0;s[i];i++){ int c=idx(s[i]); j=ch[j][c]; if(cnt[j]) calc(j); else calc(last[j]); } } }; AC ac; int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); scanf("%s\n",S); scanf("%d\n",&n); for(int i=1;i<=n;i++) { scanf("%s",SS); ac.insert(SS); } ac.getfail(); ac.find(S); printf("%d\n",ac.ans); return 0; }
相关文章推荐
- hdoj1007
- 海量数据处理算法—Bit-Map
- Trie树:应用于统计和排序
- 大数据计算:如何仅用1.5KB内存为十亿对象计数
- 用Redis bitmap统计活跃用户、留存
- 使用Storm实现实时大数据分析
- 【模板】dinic
- 大数据计算:如何仅用1.5KB内存为十亿对象计数
- 用Redis bitmap统计活跃用户、留存
- 使用Storm实现实时大数据分析
- 6个用于大数据分析的最好工具
- 【模板】LCA
- C++访问Oracle数据库
- ed2k 中的信誉和分段机制代码梳理
- 6个用于大数据分析的最好工具
- JAVA虚拟机类型转换学习
- POJ 3279 Fliptile
- PullToRefreshGridView
- Ubuntu设置右键察看右键所在目录
- 织梦DedeCMS列表页标题SEO优化