#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 ...
随机推荐
-
ASP.NET WebApi OWIN 实现 OAuth 2.0
OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth 允许用户提供一个令牌, ...
-
原生js+css3实现图片自动切换,图片轮播
运用CSS3transition及opacity属性 制作图片轮播动画 自己这两天根据用js来控制触发CSS3中transition属性,从而写出来的以CSS3动画为基础,js控制过程的图片轮播 运用 ...
-
window resize的时候禁止频繁触发事件
$(window).resize(function(){ var value=+new Date; assistantForSyncTask.execute(value); assistantForA ...
-
高效开发 Android App 的 10 个建议(转)
文章写的非常好,值得大家好好研究研究,仔细分析一下. 引文地址: http://www.cnblogs.com/xiaochao1234/p/3644989.html 假如要Google Play上做 ...
-
Lintcode: Segment Tree Build
The structure of Segment Tree is a binary tree which each node has two attributes start and end deno ...
-
H - 放苹果
Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Status Des ...
-
VS2012如何更新下载TFS上面的代码到本地
现在的代码基本上全都放在TFS上面,如何同步TFS上面的code呢? 1. Open "Team Explorer - Home" 2. Click "Source Co ...
-
BeanDefinition的载入和解析
1.在完成对代表BeanDefinition的Resource定位的分析后,下面来了解整个BeanDefinition信息的载入过程. 2.对IoC容器来说,这个载入过程,相当于把定义的BeanDef ...
-
[主席树]HDOJ4417 Super Mario
题意:n个数 m个询问 ($n.m \le 10^5$) 每个询问有l, r, k 问的是[l, r]区间内有多少个数小于等于k 用主席树做的话查询第i小的数与k比较即可 #define lson ...
-
【leetcode边做边学】二分查找应用
很多其它请关注我的HEXO博客:http://jasonding1354.github.io/ 简书主页:http://www.jianshu.com/users/2bd9b48f6ea8/lates ...