【无聊放个模板系列】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 ...
随机推荐
- Objective-C 【点语法】
------------------------------------------- 点语法的使用 // // 点语法的使用 // // 点语法: xcode的一种特性,xcode帮我们做代 ...
- JS判断移动设备最佳方法
最实用的还是下面这个: 方法一:纯JS判断 使用这方法既简单,又实用,不需要引入jQuery库,把以下代码加入到<head>里即可. <script type=”text/javas ...
- c# 远程回收IIS应用池
利用下列代码可实现IIS应用池的远程回收 var serverManager = ServerManager.OpenRemote(ip); var appPools = serverManager. ...
- 利用js来实现一些常用的算法
示例代码中的arr指的是给出的数组,s指的是数组的起始坐标0,end指的是数组的最后一个坐标arr.length-1,n指的是要查找的数字 查找某个值: 1.线性法 function findInAr ...
- Js 对象三
一.screen对象 Width:屏幕的宽度 Height:屏幕的高度 availWidth:屏幕的有效宽度 availhHeight:屏幕的有效高度 (不包含任务栏) colorDepth:色深 二 ...
- will VS be going to
1.Future - Will vs. Going to 2."Will be doing" vs. "will do" 3.Simple Future
- 关于浏览器兼容处理—— 识别IE浏览器
var b_name = navigator.appName;var b_version = navigator.appVersion;var version = b_version.split(&q ...
- Web开发常见的漏洞
SQL注入漏洞 跨站脚本攻击漏洞 登陆后台管理页面 IIS短文件/文件夹漏洞 系统敏感信息泄露
- sirius的python学习笔记(1)
1.可以通过try...except语句来简单的判断字符串是否为整数值,如例程 x = raw_input('>') try: print int(x) except ValueError: r ...
- PyQt4学习笔记2:事件和信号
事件是任何 GUI 程序中很重要的部分.所有 GUI 应用都是事件驱动的.一个应用对其生命期产生的不同的事件类型做出反应.事件是主要由应用的用户产生.但是,也可以通过其他方法产生,比如,网络通信,窗口 ...