zoukankan      html  css  js  c++  java
  • BZOJ 3881: [Coci2015]Divljak

    3881: [Coci2015]Divljak

    Time Limit: 20 Sec  Memory Limit: 768 MB
    Submit: 553  Solved: 176
    [Submit][Status][Discuss]

    Description

    Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的。
    接下来会发生q个操作,操作有两种形式:
    “1 P”,Bob往自己的集合里添加了一个字符串P。
    “2 x”,Alice询问Bob,集合T中有多少个字符串包含串S_x。(我们称串A包含串B,当且仅当B是A的子串)
    Bob遇到了困难,需要你的帮助。
     
     

    Input

    第1行,一个数n;
    接下来n行,每行一个字符串表示S_i;
    下一行,一个数q;
    接下来q行,每行一个操作,格式见题目描述。

    Output

    对于每一个Alice的询问,帮Bob输出答案。

    Sample Input

    3
    a
    bc
    abc
    5
    1 abca
    2 1
    1 bca
    2 2
    2 3

    Sample Output

    1
    2
    1

    HINT

    【数据范围】

    1 <= n,q <= 100000;

    Alice和Bob拥有的字符串长度之和各自都不会超过 2000000;

    字符串都由小写英文字母组成。

    Source

    [Submit][Status][Discuss]

    先拿到所有的S_i串,建Trie树,构造AC自动机。

    每次向T中加入一个新串,就扔进自动机走一遍,标记所有经过的结点。

    在Fail树上按DFS序访问所有visit结点,每个结点+1,相邻结点-1。

    询问S_x串的话,直接求EndPos(S_x)的子树和即可,这个就需要DFS序+线段树(或树状数组)支持一下。

    @Author: YouSiki

  • 相关阅读:
    IAP
    golang笔记——map
    Unity自动打包 apk
    golang笔记——string
    golang笔记——数组与切片
    golang笔记——array
    golang笔记——struct
    golang笔记——流程控制
    golang笔记——数据类型
    golang笔记——IDE
  • 原文地址:https://www.cnblogs.com/yousiki/p/6412218.html
Copyright © 2011-2022 走看看