2017.10.6 单词 思考记录
来源:互联网 发布:全球云计算市场格局 编辑:程序博客网 时间:2024/06/06 21:07
少有的会做的ac自动机题
、这个题是匹配模式串、
所以就不需要匹配的过程,只需要建出fail树,然后直接拓扑
由于每次加进去一个单词,这个单词的每一个字母都有可能作为最后一个字母影响他的失配,所以词路径上的每个字母都需要标记
然后失配是保证了后缀相等,所以如果失配是词,则这个点的所有继承过来的标记都可以传给失配
由于fail是一棵树,所以需要拓扑来保证每一个点都被标记充分
码:
#include<iostream>#include<cstdio>#include<queue>#include<vector>#include<cstring>using namespace std;int i,l,rt,ch[1000005][26],j,n,ans[205],tot,bj[1000005],sp[1000005],rd[1000005];char str[205][1000005];queue<int>q;vector<int>v[1000005];void jia(){int o=rt;for(j=0;j<l;j++){int zm=str[i][j]-'a';if(ch[o][zm]==0)ch[o][zm]=++tot;o=ch[o][zm];bj[o]++;}v[o].push_back(i);}void shipei(){q.push(rt);while(!q.empty()){int o=q.front();q.pop();//bj[o]=v[o].size();for(i=0;i<26;i++){if(o==0&&ch[o][i]!=0){q.push(ch[o][i]);}else if(ch[o][i]!=0){ int p=sp[o];while(ch[p][i]==0&&p!=0)p=sp[p]; sp[ch[o][i]]=ch[p][i]; rd[ch[p][i]]++;q.push(ch[o][i]);}}}return;}void tuopu(){for(i=1;i<=tot;i++){if(rd[i]==0){q.push(i);}}while(!q.empty()){int o=q.front();q.pop();for(j=0;j<v[o].size();j++)//统计一波答案{ans[v[o][j]]+=bj[o];}rd[sp[o]]--;bj[sp[o]]+=bj[o];if(rd[sp[o]]==0&&sp[o]!=0)q.push(sp[o]);}}int main(){scanf("%d",&n);for(i=1;i<=n;i++){scanf("%s",str[i]);l=strlen(str[i]);jia();}shipei();tuopu();for(i=1;i<=n;i++){printf("%d\n",ans[i]);}}
阅读全文
0 0
- 2017.10.6 单词 思考记录
- 2017.10.1 蚯蚓 思考记录
- 2017.10.5 高速公路 思考记录
- 2017.10.5 最短母串 思考记录
- 2017.10.28 压缩 思考记录
- 2017.10.28 排序 思考记录
- 2017.6.6 数表 思考记录
- 2017.9.6 礼物 思考记录
- 2017.9.6 外星人 思考记录
- 2017.10.1 atcoder TK1 D 思考记录
- 2017.10.1 互不侵犯king 思考记录
- 2017.10.7 括号序列 思考记录
- 2017.10.7 弹飞绵羊 思考记录
- 2017.10.9 放棋子 思考记录
- 2017.10.10 杀人游戏 思考记录
- 2017.10.11 network 网络扩容 思考记录
- 2017.10.13 硬币游戏 思考记录
- 2017.10.17 蜘蛛难题 思考记录
- secureCRT及secureFX安装注册和secureFX中出现中文乱码的处理方式
- 【实战】3 数据表结构设计
- 模拟Sum函数(版本二)
- C语言 输出任意两个数之间的质数
- requests+正则表达式爬猫眼电影TOP100
- 2017.10.6 单词 思考记录
- Hibernate 多对一配置
- mongodb(三):索引构建分析和用户权限
- poj2594 最小路径覆盖 (点可以重复访问)
- 2014 Benelux Algorithm Programming Contest (BAPC 14) K
- 数据结与算法之查找
- java基础数组排序
- 正则表达式
- Hibernate--->缓存