题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3172

题意:给出n个单词。输出每个单词在所有单词中一共出现多少次?

思路:首先将所有单词插入到ac自动机,记录每个节点次数cnt。建立自动机。然后按照建立自动机的顺序,对于节点u以及其fail节点v,cnt[v]+=cnt[u]。最后找到每个单词在自动机的对应节点u,则cnt[u]就是该单词答案。

struct node
{
    int next[26],cnt,fail;
    
    void init()
    {
        clr(next,-1); fail=-1; cnt=0;
    }
};

node a[N];
int e;

void insert(char s[])
{
    int i,k,p=0;
    for(i=0;s[i];i++)
    {
        k=s[i]-'a';
        if(a[p].next[k]==-1)
        {
            a[e].init();
            a[p].next[k]=e++;
        }
        p=a[p].next[k];
        a[p].cnt++;
    }
}

int Q[N];

void build()
{
    int L=0,R=0,i,k,p,q;
    FOR0(i,26) if(a[0].next[i]!=-1)
    {
        Q[R++]=a[0].next[i];
        a[a[0].next[i]].fail=0;
    }
    while(L<R)
    {
        k=Q[L++];
        FOR0(i,26) if(a[k].next[i]!=-1)
        {
            p=a[k].next[i];
            q=a[k].fail;
            Q[R++]=p;
            while(q!=-1&&a[q].next[i]==-1) q=a[q].fail;
            if(q!=-1&&a[q].next[i]!=-1) a[p].fail=a[q].next[i];
            else a[p].fail=0;
        }
    }
    for(i=R-1;i>=0;i--)
    {
        a[a[Q[i]].fail].cnt+=a[Q[i]].cnt;
    }
}

char s[201][N];
int n;

int main()
{
    RD(n); a[0].init(); e=1;
    int i,j,k;
    FOR1(i,n) RD(s[i]),insert(s[i]);
    build();
    FOR1(i,n)
    {
        k=0;
        for(j=0;s[i][j];j++) k=a[k].next[s[i][j]-'a'];
        PR(a[k].cnt);
    }
}

BZOJ 3172 单词(ac自动机)的更多相关文章

  1. bzoj 3172 单词 ac自动机|后缀数组

    题目大意: 给定n个字符串连成了一篇文章,问每个字符串在这篇文章中出现的次数,可重复覆盖 这里ac自动机和后缀数组都可以做 当然后缀数组很容易就解决,但是相对时间消耗高 这里就只讲ac自动机了 将每个 ...

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

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

  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]单词 AC自动机

    关于AC自动机:一个在kmp与Trie的基础上建立的数据结构,关键在于Trie树结构与fail指针,他们各有各的应用.在AC自动机里最典型的就是多串匹配,原本效率为O(n*l+n*l+m*l),(n是 ...

  5. BZOJ 2905: 背单词 AC自动机+fail树+dfs序+线段树

    Description 给定一张包含N个单词的表,每个单词有个价值W.要求从中选出一个子序列使得其中的每个单词是后一个单词的子串,最大化子序列中W的和. Input 第一行一个整数TEST,表示数据组 ...

  6. bzoj 3172 单词

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

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

    [BZOJ3172][Tjoi2013]单词 Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input ...

  8. 洛谷P3966 [TJOI2013]单词(AC自动机)

    题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 输入输出格式 输入格式: 第一行一个整数N,表 ...

  9. BZOJ2905: 背单词 AC自动机+fail树+线段树

    $zjq$神犇一眼看出$AC$自动机 $Orz$ 直接就讲做法了 首先对每个串建出$AC$自动机 将$fail$树找到 然后求出$dfs$序 我们发现一个单词 $S_i$是$S_j$的子串当且仅当$S ...

随机推荐

  1. Memcached使用

    一.Memcached简介 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网 ...

  2. c++11 lambda(匿名函数)

    #include <iostream> #include <functional> using namespace std::placeholders; //lambda即匿名 ...

  3. ios 图片转视频

    转自:http://blog.iosxcode4.com/archives/160 用到的FrameWork有: MediaPlayer.framework,QuartzCore.framework, ...

  4. SOA之(1)——SOA架构基础概念

    在深入探讨什么是面向服务的架构(SOA)之前,先建立一些基本的概念和术语的基本描述而非严格定义,所以也许有些定义在业内还存留争议,此处暂且忽略. 架构基础 技术架构(Technology Archit ...

  5. 电信SDK Pay函数里面System.out.print 无输出消息

    private void Pay(HashMap<String, String> payParams){ System.out.print("----------Pay Dian ...

  6. Sublime Text 编辑器

    1.从http://www.sublimetext.com/2 下载Sublime Text 2编辑器. 2.安装Package Control 管理器,用于管理和安装插件包. 下载地址:https: ...

  7. What does addScalar do?

    The JavaDoc says: SQLQuery org.hibernate.SQLQuery.addScalar(String columnAlias, Type type) Declare a ...

  8. Wamp Mysql错误消息 语言设置

    Wamp Mysql错误消息 语言设置 http://my.oschina.net/wandershi/blog/264347 打开my.ini   找到 [wampmysqld] port = 33 ...

  9. NSArray block用法

    28.使用block 块遍历整个数组.这个block 需要三个参数,id obj 表示数组中的元素. NSUInteger idx 标示元素的下标, bool *stop 是一个bool类型的参数. ...

  10. 树莓派/RaspberryPi 内核编译

    1.获取所需源码 1)下载地址: 官方网址:https://github.com/raspberrypi 上面列出了树莓派所有的开源软件: linux:内核源码 tools:编译内核和其他源码所需的工 ...