【无聊放个模板系列】BZOJ 3172 (AC自动机)
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<stack>
using namespace std;
#define Maxn 210
#define Maxm 1000010 struct node
{
int son[],fail,cnt;
}t[Maxm];int tot; char s[Maxm];
int l,bj[Maxn]; void upd(int x)
{
memset(t[x].son,,sizeof(t[x].son));
t[x].fail=t[x].cnt=;
} void trie(int st)
{
int now=;
for(int i=;i<=l;i++)
{
int ind=s[i]-'a'+;
if(!t[now].son[ind])
{
t[now].son[ind]=++tot;upd(tot);
}
now=t[now].son[ind];
t[now].cnt++;
if(i==l) bj[st]=now;
}
} queue<int > q;
stack<int > sta;
void build()
{
while(!q.empty()) q.pop(); q.push();
while(!q.empty())
{
int x=q.front();sta.push(x);
q.pop();
for(int i=;i<=;i++) if(t[x].son[i])
{
if(x&&t[t[x].fail].son[i]) t[t[x].son[i]].fail=t[t[x].fail].son[i];
q.push(t[x].son[i]);
}
else t[x].son[i]=t[t[x].fail].son[i];
}
while(!sta.empty())
{
int x=sta.top();sta.pop();
t[t[x].fail].cnt+=t[x].cnt;
}
} int main()
{
int n;
scanf("%d",&n);
tot=;upd();
for(int i=;i<=n;i++)
{
scanf("%s",s+);
l=strlen(s+);
trie(i);
}
build();
for(int i=;i<=n;i++) printf("%d\n",t[bj[i]].cnt);
return ;
}
WA了几次之后终于给面子A了【捂脸= =打模板而已嘛- -
多年前手打队列版本
#include<cstdio>
#include<cstdlib>
#include<cstring> const int Maxn=(int)1e4;
const int Maxl=; struct node
{
int son[],fail,cnt,ans;
}t[]; int n,m,cnt=;
int q[Maxn*Maxl+],bj[Maxn];
char s[Maxl]; void floy()
{
int i;
for(i=;i<=Maxn;i++) t[i].fail=,t[i].ans=;
} void read()
{
memset(bj,,sizeof(bj));
int i,j,x,ind;
scanf("%d",&n);
getchar();
for(i=;i<=n;i++)
{
scanf("%s",s+);
m=strlen(s+);
x=;
for(j=;j<=m;j++)
{
ind=s[j]-'a'+;
if(!t[x].son[ind]) t[x].son[ind]=++cnt;
x=t[x].son[ind];
t[x].cnt++;
if(j==m) bj[i]=cnt;
}
}
} void Build_AC()
{
int i,x,y,j;
q[]=;
q[++q[]]=;
//for(i=1;i<=26;i++) if(t[0].son[i]) q[++q[0]]=t[0].son[i];
for(i=;i<=q[];i++)
{
x=q[i];
y=t[x].fail;
for(j=;j<=;j++)
if(t[x].son[j])
{
//t[t[x].son[j]].fail=t[y].son[j];
t[t[x].son[j]].fail=x?t[y].son[j]:x;
q[++q[]]=t[x].son[j];
}
else t[x].son[j]=t[y].son[j];
}
for(i=q[];i>=;i--)
{
t[t[q[i]].fail].cnt+=t[q[i]].cnt;
}
//for(i=1;i<=cnt;i++) printf("%d %d %d %d\n",i,t[i].cnt,t[i].fail,t[i].ffail);
} int main()
{
read();
Build_AC();
for(int i=;i<=n;i++) printf("%d\n",t[bj[i]].cnt);
return ;
}
AC自动机
2016-11-18 10:18:14
【无聊放个模板系列】BZOJ 3172 (AC自动机)的更多相关文章
- bzoj 3172 AC自动机
初学AC自动机,要先对于每一个模式串求出来trie树,在此基础上构建fail指针,然后在trie树加上失配边构建出整张trie图. AC自动机的原理和KMP差不多,一个节点的fail指针就是指向tri ...
- 【无聊放个模板系列】BZOJ 1597 斜率优化
STL 双向队列DEQUE版本 #include<cstdio> #include<cstdlib> #include<cstring> #include<i ...
- 【无聊放个模板系列】HDU 3506 (四边形不等式优化DP-经典石子合并问题[环形])
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #inc ...
- 【无聊放个模板系列】POJ 3678 2-SAT
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #inc ...
- 【无聊放个模板系列】POJ 1274 (匈牙利)
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #inc ...
- 【无聊放个模板系列】HDU 1269 (SCC)
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #inc ...
- 【无聊放个模板系列】HDU 1358 KMP
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #inc ...
- 【无聊放个模板系列】HDU 3068 MANACHER
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #inc ...
- 【无聊放个模板系列】POJ2752 EXKMP
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #inc ...
随机推荐
- MVC 生成PDf表格并插入图片
最近做的项目中有一个功能,将最终的个人信息生成PDF表格,并插入图片.对于没接触过的程序员来说回一片茫然,网上有多种生成PDf的方法,我给大家介绍一下我认为比较简单,好操作的一种. iTextShar ...
- 3月3日(2) Search Insert Position
这题...有点简单吧,为什么只有34%的通过率? 题目意思简单说就是查找index,或者按升序插入的未知,WA一次,罪过,下次要特别注意程序里变量的变化,提交前用样例检查. 简单的我有点不好意思贴代码 ...
- js异步收集
http://www.cnblogs.com/rubylouvre/archive/2011/03/18/1984336.html http://www.cnblogs.com/hustskyking ...
- 发送邮件(遵循smtp协议即简单的邮件发送协议)
HandleSendEmail.aspx逻辑 protected void Page_Load(object sender,EventArgs e) { foreach(var item in Req ...
- php删除html标签的三种解决方法
分享下PHP删除HTMl标签的三种方法. 方法1:直接取出想要取出的标记 <?php //取出br标记 function strip($str) { $str=str_replace(" ...
- Android类库常用类库一览
在Android SDK中包括很多包文件,通过了解这些包的功能也有助于了解可以开发的功能. 在Android类库中,各种包写成android.*的方式,重要包的描述如下所示: android.app ...
- jsp+oracle 排序分页+Pageutil类
1.rownum和排序 Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了. SQL> select rownum ,id,n ...
- 模式对话框里的CheckedChanged事件
问题: 模式对话框里的CheckedChanged事件不被触发: 解决方法: 一.先不直接showModalDialog出要的页面,而是要放一个中单页面 window.showModalDialo ...
- easy ui datagrid 数据绑定
1.前台页面 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...
- Hibernate从入门到精通(九)一对多双向关联映射
上次的博文Hibernate从入门到精通(八)一对多单向关联映射中,我们讲解了一下一对多单向映射的相关内容,这次我们讲解一下一对多双向映射的相关内容. 一对多双向关联映射 一对多双向关联映射,即在一的 ...