1、 题目大意:一篇论文是由许多单词组成,现在想知道每个单词分别在论文中出现多少次。

2、分析:对着 广义后缀自动机的图看,我们就会发现玄机,答案不就是这个单词下的后缀个数吗?

于是建立自动机,然后求出right,统计答案就好,另外说一句,right集合用基数排序之后更新一下就好

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
struct SAM{
    struct node{
        int tranc[27], fa, len, right;
    } a[2002010];
    int c[2002010], od[2002010];
    int cnt, tail;
    SAM(){
        tail = ++ cnt;
    }
    void insert(int k){
        int p, np = ++ cnt, q, nq;
        a[np].len = a[tail].len + 1;
        a[np].right = 1;
        for(p = tail; p && !a[p].tranc[k]; p = a[p].fa) a[p].tranc[k] = np;
        if(!p) a[np].fa = 1;
        else{
            q = a[p].tranc[k];
            if(a[q].len == a[p].len + 1) a[np].fa = q;
            else{
                a[nq = ++ cnt] = a[q];
                a[q].fa = a[np].fa = nq;
                a[nq].len = a[p].len + 1;
                a[nq].right = 0;
                for(; a[p].tranc[k] == q; p = a[p].fa) a[p].tranc[k] = nq;
            }
        }
        tail = np;
    }
    void init(int m){
        for(int i = 1; i <= cnt; i ++) c[a[i].len] ++;
        for(int i = 1; i <= m; i ++) c[i] += c[i - 1];
        for(int i = cnt; i >= 1; i --) od[c[a[i].len] --] = i;
        for(int i = cnt; i >= 1; i --){
            int x = od[i];
            a[a[x].fa].right+=a[x].right;
        }
        return;
    }
} sam;
char str[2000100];
int tot;
int main(){
    int n;
    scanf("%d", &n);
    tot = -1;
    for(int i = 1; i <= n; i ++){
        char ch = getchar();
        while(ch < 'a' || ch > 'z') ch = getchar();
        while('a' <= ch && ch <= 'z'){
            str[++ tot] = ch;
            ch = getchar();
        }
        str[++ tot] = 'z'+1;
    }
    tot ++;
    for(int i = 0; i < tot; i ++) sam.insert(str[i] - 'a');
    sam.init(tot);
    int num;
    int o = 0;
    for(int i = 1; i <= n; i ++){
        int now = 1, j;
        for(j = o; ((int)str[j] != 'z'+1) && (j < tot); j ++){
            now = sam.a[now].tranc[str[j]-'a'];
        }
        o = j + 1;
        printf("%d\n", sam.a[now].right);
    }
    return 0;
}

BZOJ3172——[Tjoi2013]单词的更多相关文章

  1. BZOJ3172 [Tjoi2013]单词 【AC自动机】

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 4293  Solved: 2083 [Submit][Stat ...

  2. [Bzoj3172][Tjoi2013]单词(fail树)

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

  3. BZOJ3172 [Tjoi2013]单词 字符串 SA ST表

    原文链接http://www.cnblogs.com/zhouzhendong/p/9026543.html 题目传送门 - BZOJ3172 题意 输入$n(n\leq 200)$个字符串,保证长度 ...

  4. BZOJ3172: [Tjoi2013]单词

    传送门 做了这么多题怎么还是无法很好的理解AC自动机呢..果然是个制杖 首先题意表述不是很清晰,这些所有的单词组成了那个文章,所以果断建个AC自动机,建的时候给每个点附加一个权值,建树是经过一次权值即 ...

  5. bzoj千题计划315:bzoj3172: [Tjoi2013]单词(AC自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3172 构建AC自动机 在fail树上,点i的子树大小 表示trie树上根节点到i构成的单词 是 多 ...

  6. BZOJ3172[Tjoi2013]单词——AC自动机(fail树)

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

  7. bzoj3172: [Tjoi2013]单词 ac自动机

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

  8. [BZOJ3172 ][Tjoi2013]单词(AC自动机)

    Description 不稳定的传送门 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次.单词个数<=200,单词总长度< ...

  9. 【AC自动机】bzoj3172: [Tjoi2013]单词

    fail图上后缀和需要注意一下 Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input 第一个一个整 ...

随机推荐

  1. Jsonp类

    public class JsonpResult : JsonResult { public JsonpResult() { this.Callback = "callback"; ...

  2. Java递归算法——二分查找

    import java.lang.reflect.Array; import java.nio.Buffer; import java.util.Arrays; import java.util.Ra ...

  3. group

    学习Linq时,经常会遇到Linq使用Group By问题,这里将介绍Linq使用Group By问题的解决方法. 1.计数 var q = from p in db.Products group p ...

  4. localdb下载地址

    https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=29062 只能使用IE下载 http://www.microsoft.co ...

  5. System.out.println与System.err.println的区别(输出顺序!!!)

    System.out.println与System.err.println的区别(输出顺序!!!) 分类:java (208)  (0) System.out.println与System.err.p ...

  6. jquery 判断网络图片,或网络文件是否存在

    $.ajax({ url : picSrc, async : false, type : 'HEAD', error : function() { picSrc = "https://ss0 ...

  7. 安装CentOS7重启后提示License information

    Initial setup of CentOS Linux (core) ) [x] Creat user ) [!] License information (no user will be cre ...

  8. 使用BeanNameAutoProxyCreator实现spring的自动代理

    提到代理,我们可以使用ProxyBeanFactory,并配置proxyInterfaces,target和interceptorNames实现,但如果需要代理的bean很多,无疑会对spring配置 ...

  9. Java8初体验(一)lambda表达式语法

    感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com 本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人也是刚刚开始学习Java8,所以文中肯定有错误和理解 ...

  10. Source Insight 基本使用(2)-修改Source Insight 快捷键

    1. 首先,打开source insight主界面. 2. 选择"options->key assignments",进入快捷键设置界面. 3. 此时,可以看到快捷键设置对话 ...