AC自动机

拓扑排序优化,注意拓扑排序前要把所有入度为零的点都加进去

#include<bits/stdc++.h>
using namespace std;
#define maxn 1000005
#define maxm 28
struct AC
{
int trieN;
int ch[maxn][maxm];
int val[maxn];
int fail[maxn];
int ans[maxn];
int in[maxn];///用于拓扑排序
vector<int> s[maxn];
int tim[maxn];
void init()
{
trieN=-;
newnod();
}
int newnod()
{
memset(ch[++trieN],,sizeof ch[]);
val[trieN]=fail[trieN]=;
tim[trieN]=;s[trieN].clear();
return trieN;
}
void insert(const string & str,int k)
{
int cur=;
for(int i=; i<str.size(); i++)
{
int d=str[i]-'a';
if(!ch[cur][d])
{
ch[cur][d]=newnod();
}
cur=ch[cur][d];
}
val[cur]++;
s[cur].push_back(k);
}
void build()
{
queue<int> q;
for(int i=; i<maxm; i++)
{
if(ch[][i])
{
q.push(ch[][i]);
}
}
// q.push(0);
while(!q.empty())
{
int cur=q.front();
q.pop();
for(int i=; i<maxm; i++)
{
if(ch[cur][i])
{
// cout<<cur<<' '<<i<<endl;
//cout<<fail[cur]<<'\n';
fail[ch[cur][i]]=ch[fail[cur]][i];
in[fail[ch[cur][i]]]++;
//cout<<fail[ch[cur][i]]<<"INNNNN"<<'\n';
q.push(ch[cur][i]);
}
else
{
ch[cur][i]=ch[fail[cur]][i];
}
}
}
}
//vector<int>ans;
//int man=0;
void topu()
{
queue<int>q;
/*for(int i=1;i<=trieN;i++){
cout<<i<<"IN"<<in[i]<<'\n'; }*/
for(int i=;i<=trieN;i++){
if(in[i]==){
q.push(i);}}
while(!q.empty()){ int x=q.front();
//cout<<x<<" "<<ans[x]<<'\n';
q.pop();
if(val[x]){
for(int i=;i<s[x].size();i++)
tim[s[x][i]]=ans[x];
} int y=fail[x];
ans[y]+=ans[x];
in[y]--;
if(in[y]==)q.push(y);
} }
void query(const string & str)
{
int res=,cur=;
for(int i=; str[i]; i++)
{
int d=str[i]-'a';
cur=ch[cur][d];
ans[cur]++;
}
}
} ac;
//string A[maxn];
int main()
{
string s;
int n;
while(scanf("%d",&n)!=EOF)
{
ac.init();
//if(n==0)break;
for(int i=; i<n; i++)
{
cin>>s;
ac.insert(s,i);
}
ac.build();
cin>>s;
ac.query(s);
ac.topu();
for(int i=;i<n;i++){
cout<<ac.tim[i]<<'\n';
}
}
}

最新文章

  1. 【Java EE 学习 36】【struts2】【struts2系统验证】【struts2 ognl值栈】【struts2 ongl标签】【struts2 UI标签】【struts2模型驱动和令牌机制】
  2. $(inherited) &quot;$(SRCROOT) 修改.a文件的路径 --Library Search Paths
  3. footer元素
  4. sql2008备份集中的数据库备份与现有的xxx数据库不同解决方法
  5. java反射之Class.getMethod与getDeclaredMethods()区别
  6. 好书推荐:《Game Programming Patterns》
  7. FastDFS 的部署、配置与测试的
  8. IOS 警告框 (UIAlertView)的使用方法
  9. 更改系统相机UIImagePickerController导航栏的cancle为自定义按钮
  10. CentOS/RHEL 7中的firewall控制
  11. Java 浅析Thread.join()
  12. [转]Vmware(vmdk)虚拟机到hyperv(vhd)虚拟机转换
  13. bzoj 1151: [CTSC2007]动物园zoo
  14. AxonFramework
  15. 《Python黑帽子:黑客与渗透测试编程之道》 扩展Burp代理
  16. JS获取地址栏参数&amp;jquery
  17. centos如何设置定时任务
  18. 场景设计以及Manual Scenario和Goal-OrientedScenario的区别
  19. RF设置全局变量
  20. noip前打板子 qwq

热门文章

  1. 书籍:wpf学习书籍介绍
  2. window10下搭建ELK环境
  3. 创建MySQL数据库账号
  4. Desert King(01分数规划问题)(最优斜率生成树)
  5. js实现计算器效果
  6. js倒计时跳转jquery插件版
  7. 第三方模块:gulp模块
  8. Maven 添加其他Maven组件配置问题
  9. C# 中定义扩展方法
  10. [效率神技]Intellij 的快捷键和效率技巧|系列一|常用快捷键