题目大意:

一篇论文是由许多单词组成,现在想知道每个单词分别在论文中出现多少次.

题解:

我们首先考虑fail指针的含义

如果fail[x] = y,那么我们就知道y作为x的后缀在x中出现了一次

所以对于一般串的来说fail[x]都会在x中出现

那么我们就有siz[fail[x]] += siz[x]

其中siz表示该串在文章中出现的次数(初始值为1)

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
const int maxn = 256;
const int maxl = 1000010;
int ch[maxl][26],nodecnt;
int siz[maxl];
int mp[maxn];
void insert(int pos,char *s){
int len = strlen(s),nw = 0;
for(int i=0,c;i<len;++i){
c = s[i] - 'a';
if(ch[nw][c] == 0) ch[nw][c] = ++ nodecnt;
nw = ch[nw][c];siz[nw] ++;
}mp[pos] = nw;
}
int q[maxl],l,r,f[maxl];
int ans[maxl];
inline void build(){
f[0] = 0;l = 0;r = -1;
int u = 0;
for(int c=0;c<26;++c){
if(ch[u][c]){
f[ch[u][c]] = 0;
q[++r] = ch[u][c];
}
}
while(l <= r){
u = q[l++];
for(int c=0;c<26;++c){
int v = ch[u][c];
if(!v){
//ch[u][c] = ch[f[u]][c];
continue;
}q[++r] = v;
int x = f[u];
while(x && !ch[x][c]) x = f[x];
f[v] = ch[x][c];
}
}
for(int i=r;i>=0;--i){
siz[f[q[i]]] += siz[q[i]];
}
}
char s[maxl];
int main(){
int n;read(n);
for(int i=1;i<=n;++i){
scanf("%s",s);
insert(i,s);
}build();
for(int i=1;i<=n;++i) printf("%d\n",siz[mp[i]]);
getchar();getchar();
return 0;
}

bzoj 3172: [Tjoi2013]单词 fail树的更多相关文章

  1. BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 3198  Solved: 1532[Submit][Status ...

  2. BZOJ 3172([Tjoi2013]单词-后缀数组第一题+RMQ)

    3172: [Tjoi2013]单词 Time Limit: 10 Sec   Memory Limit: 512 MB Submit: 268   Solved: 145 [ Submit][ St ...

  3. bzoj 3172: [Tjoi2013]单词 AC自动机

    3172: [Tjoi2013]单词 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  4. bzoj 3172 [Tjoi2013]单词(fail树,DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3172 [题意] 题目的意思是这样的,给若干个单词,求每个单词在这一堆单词中的出现次数. ...

  5. BZOJ 3172 [Tjoi2013]单词 AC自己主动机(fail树)

    题意:链接 方法:AC自己主动机与fail树性质 解析:复习AC自己主动机的第一道题?(真正的第一题明明是又一次写了遍hdu2222! ) 这题说实话第一眼看上去就是个sb题,仅仅要建出来自己主动机. ...

  6. [BZOJ 3172] [Tjoi2013] 单词 【AC自动机】

    题目链接:BZOJ - 3172 题目分析: 题目要求求出每个单词出现的次数,如果把每个单词都在AC自动机里直接跑一遍,复杂度会很高. 这里使用AC自动机的“副产品”——Fail树,Fail树的一个性 ...

  7. BZOJ 3172 [Tjoi2013]单词 AC自动机Fail树

    题目链接:[http://www.lydsy.com/JudgeOnline/problem.php?id=3172] 题意:给出一个文章的所有单词,然后找出每个单词在文章中出现的次数,单词用标点符号 ...

  8. ●BZOJ 3172 [Tjoi2013]单词

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3172 题解: 把单词逐个接起来,中间用互不相同的字符连接,并记录下每个单词的首字母在串中的位 ...

  9. 【刷题】BZOJ 3172 [Tjoi2013]单词

    Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input 第一个一个整数N,表示有多少个单词,接下来N ...

随机推荐

  1. VS2019取消git源代码管理

    VS2019->工具->选项->源代码管理->插件管理 详见下图

  2. WPF 支持集合绑定的控件

    WPF 支持集合绑定的控件 ListBox ComboBox ListView DataGrid

  3. ibatis实现Iterate的使用 (转)

    <iterate         property="" /*可选,              从传入的参数集合中使用属性名去获取值,              这个必须是一 ...

  4. ASP-AJAX-分页格式

    HTML: <html> <head> <title>Mazey</title> <meta name="description&quo ...

  5. SAP basis 常用事物

    1.创建一个新的用户 完成client创建和拷贝后,在开始正式工作之前,需要创建新的用户.  用这个用户进行工作.默认ddic和sap*用户不要用于实际的业务.  创建用户的过程很简单,只要以su01 ...

  6. Python 面试题(下)

    接上篇. 网络 1 三次握手 客户端通过向服务器端发送一个SYN来创建一个主动打开,作为三路握手的一部分.客户端把这段连接的序号设定为随机数 A. 服务器端应当为一个合法的SYN回送一个SYN/ACK ...

  7. Qt Creator 调试器 在 Ubuntu 13.10下 局部变量和表达式(Locals) 无内容

    此篇算是一个翻译,万一有国内同样的小白遇到同样问题,方便参考. 原文http://hostilefork.com/2013/10/20/qtcreator-debugger-no-locals-ubu ...

  8. 第13条:合理利用try/expect/else/finally结构中的每个代码块

    核心知识点: (1)无论try块是否发生异常,都可以使用try/finally复合语句中地finally块来执行清理工作. (2)顺利运行try块后,若想使某些操作能在finally块地清理代码之前执 ...

  9. sidekiq

    redis-server 需要先被安装

  10. RockerMQ connect to<:10009>fail

    producer端发送报错 com.alibaba.rocketmq.client.exception.MQClientException: Send [] times, still failed, ...