#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自动机)的更多相关文章

  1. bzoj 3172 AC自动机

    初学AC自动机,要先对于每一个模式串求出来trie树,在此基础上构建fail指针,然后在trie树加上失配边构建出整张trie图. AC自动机的原理和KMP差不多,一个节点的fail指针就是指向tri ...

  2. 【无聊放个模板系列】BZOJ 1597 斜率优化

    STL 双向队列DEQUE版本 #include<cstdio> #include<cstdlib> #include<cstring> #include<i ...

  3. 【无聊放个模板系列】HDU 3506 (四边形不等式优化DP-经典石子合并问题[环形])

    #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #inc ...

  4. 【无聊放个模板系列】POJ 3678 2-SAT

    #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #inc ...

  5. 【无聊放个模板系列】POJ 1274 (匈牙利)

    #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #inc ...

  6. 【无聊放个模板系列】HDU 1269 (SCC)

    #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #inc ...

  7. 【无聊放个模板系列】HDU 1358 KMP

    #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #inc ...

  8. 【无聊放个模板系列】HDU 3068 MANACHER

    #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #inc ...

  9. 【无聊放个模板系列】POJ2752 EXKMP

    #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #inc ...

随机推荐

  1. Xcode7中添加3DTouch

    首先是插件SBShortcutMenuSimulator的安装 1.git clone https://github.com/DeskConnect/SBShortcutMenuSimulator.g ...

  2. 20分钟入门Redux

    Redux就是个数据中心,不依附于任何框架在哪使用都行.但是和它最搭配的应该就是React了,而且大家学习它的动力大多也是解决React状态管理的问题.都说Redux文档详尽清晰,但我感觉并不友好,它 ...

  3. Php 魔术常量

    魔术常量 由于其值在程序运行过程中不允许更改,所以是常量:其值,又是运行环境不同而不现,所以叫魔术. __DIR__            当前脚本文件的路径 示例: __LINE__         ...

  4. ArrayList和Array之间的转换

    ArrayList转Array (1):使用ArrayList的toArray方法.     1)当ArrayList中存放的是引用类型时(例如String),成功     /**      * 使用 ...

  5. C/C++中浮点数格式学习——以IEEE75432位单精度为例

    这是浮点数的通常表示形式,在IEEE754中,单精度浮点数有如下形式: 位单精度 个比特存储. 位长 至23偏正值(实际的指数大小+127) 至0位编号(从右边开始为0) S为符号位,Exp为指数字, ...

  6. PHP 类的静态变量索引

    直接上代码 <?php class example{ public static $pa; public $pb; public function __construct(){ $this-&g ...

  7. 开源 侧滑 和 Tab滑动翻页 控件

    侧滑 https://github.com/jfeinstein10/SlidingMenu Tab滑动翻页 https://github.com/astuetz/PagerSlidingTabStr ...

  8. SQL Server 2008 R2密钥序列号

    SQL Server 2008 R2密钥序列号 序列号: 开发版(Developer): PTTFM-X467G-P7RH2-3Q6CG-4DMYB 企业版(Enterprise): JD8Y6-HQ ...

  9. 51nod1265四点共面

    1265 四点共面 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出三维空间上的四个点(点与点的位置均不相同),判断这4个点是否在同一个平面内(4点共线也算共面).如 ...

  10. Delphi2010中DataSnap技术网摘

    一.为DataSnap系统服务程序添加描述 这几天一直在研究Delphi 2010的DataSnap,感觉功能真是很强大,现在足有理由证明Delphi7该下岗了. DataSnap有三种服务模式,其中 ...