Codeforces 题目传送门 & 洛谷题目传送门

一道 ACAM 的 hot tea

首先建出 ACAM。考虑枚举长串,以及短串在长串中出现的最后位置 \(j\),这个复杂度显然是 \(\mathcal O(\sum|s_i|)\) 的不会出问题。那么显然只有以 \(s_{i,j}\) 为结尾的、长度最长的字符串才有可能被统计进答案,否则就不满足题目中的条件了,而这个字符串,显然就是 \(s_{i,j}\) 对应位置在 fail 树上向上跳得到的第一个是某个字符串结尾的位置所对应的字符串,这个可以通过对 fail 树进行一遍 DFS 求出。

其次,仔细想想就会发现这些字符串也并不是所有都真的符合条件,如果我们把这一个个字符串看作一个个框,那么如果一个框被另一个框完全包含,那显然也是不合法的,这个可以通过记录个啥数组然后线性扫一遍把这些不合法的排除掉。但是再即便是排除掉这些不合法的字符串之后也有可能出现不合法,或者同一字符串被重复统计的情况,因为对于一个未被排除掉的字符串 \(s_i[l...r]\),有可能存在它的另一个出现位置 \(s_i[l'...r']\),满足 \(s_i[l'...r']\) 不是以 \(s_{i,r'}\) 结尾的长度最长的符合要求的字符串,或者是以 \(s_{i,r'}\) 结尾的长度最长的符合要求的字符串但被另外一个框完全包含。怎么 check 这样的情况呢?好办,拿个 map 记录一下所有字符串在 \(s_i\) 中被统计的次数,然后在 map 里面扫描一遍看所有字符串 \(s'\) 在 \(s_i\) 中出现次数是否等于其被统计的次数,如果是则答案加 \(1\),否则说明 \(s'\) 肯定有被排除掉的情况,就不能产生贡献了。

时间复杂度 \(|S|\log|S|\)。

const int MAXN=1e6;
int n,ch[MAXN+5][28],ncnt=0,fail[MAXN+5],ed[MAXN+5],ps[MAXN+5];
string s[MAXN+5];
void insert(string s,int id){
int cur=0;
for(int i=0;i<s.size();i++){
if(!ch[cur][s[i]-'a']) ch[cur][s[i]-'a']=++ncnt;
cur=ch[cur][s[i]-'a'];
} ed[id]=cur;ps[cur]=id;
}
int hd[MAXN+5],to[MAXN+5],nxt[MAXN+5],ec=0,bgt[MAXN+5],edt[MAXN+5],tim;
void adde(int u,int v){to[++ec]=v;nxt[ec]=hd[u];hd[u]=ec;}
void getfail(){
queue<int> q;
for(int i=0;i<26;i++) if(ch[0][i]) q.push(ch[0][i]);
while(!q.empty()){
int x=q.front();q.pop();
for(int i=0;i<26;i++){
if(ch[x][i]) fail[ch[x][i]]=ch[fail[x]][i],q.push(ch[x][i]);
else ch[x][i]=ch[fail[x]][i];
}
}
for(int i=1;i<=ncnt;i++) adde(fail[i],i);
}

Codeforces 1483F - Exam(AC 自动机)的更多相关文章

  1. Codeforces 163E(ac自动机、树状数组)

    要点 显然ac自动机的板子就可以暴力一下答案了 为了优化时间复杂度,考虑套路fail树的dfs序.发现本题需要当前这个尾点加上所有祖先点的个数,考虑使用树状数组差分一下,在父点+1,在子树后-1,每次 ...

  2. AC 自动机

    AC自动机(Aho-Corasick Automata)是经典的多模式匹配算法.从前我学过这个算法,但理解的不深刻,现在已经十分不明了了.现在发觉自己对大部分算法的掌握都有问题,决定重写一系列博客把学 ...

  3. Codeforces 717G Underfail(最小费用最大流 + AC自动机)

    题目 Source http://codeforces.com/problemset/problem/717/G Description You have recently fallen throug ...

  4. CodeForces 710F 强制在线AC自动机

    题目链接:http://codeforces.com/contest/710/problem/F 题意:维护一个集合,集合要求满足三种操作. 1 str:向集合插入字符串str(保证不会插入之前已经插 ...

  5. 【题解】Tree-String Problem Codeforces 291E AC自动机

    Prelude 传送到Codeforces:(/ω\)--- (/ω•\) Solution 很水的一道题. 对查询的串建出来AC自动机,然后树上随便跑跑就行了. 为什么要写这篇题解呢? 我第一眼看到 ...

  6. Codeforces 86C Genetic engineering(AC自动机+DP)

    题目大概是给几个DNA片段,求构造一个长度n的字符串的方案数,要求这个字符串每个位置的字符都属于某个包含于此字符串的DNA片段. 把那些DNA片段建一个AC自动机.考虑状态的表示: dp[len][x ...

  7. Codeforces 1015F Bracket Substring AC自动机 + dp

    Bracket Substring 这么垃圾的题怎么以前都不会写啊, 现在一眼怎么就会啊.... 考虑dp[ i ][ j ][ k ][ op ] 表示 已经填了 i 个空格, 末尾串匹配到 所给串 ...

  8. CodeForces - 710F:String Set Queries (二进制分组 处理 在线AC自动机)

    ou should process m queries over a set D of strings. Each query is one of three kinds: Add a string ...

  9. Codeforces 291 E Tree-String Problem AC自动机

    Tree-String Problem 网上的dfs + kmp 复杂度就是错的, 除非算出根据下一个字符直接转移Next数组直接转移, 而求出Next[ i ][ 26 ]数组和丢进AC自动机里面没 ...

随机推荐

  1. python常用功能

    1. 获取昨天日期 引入datetime模块 import datetime def getYesterday(): today = datetime.date.today() #返回当前本地日期 # ...

  2. 脚本注入1(boolean&&get)

    现在,我们回到之前,练习脚本支持的布尔盲注(get型). 布尔盲注的应用场景是查询成功和失败时回显不同,且存在注入点的地方. 这里以Less-8为例: 发现查询成功时,会显示:失败则无回显. 同时发现 ...

  3. 如果你还不知道Apache Zookeeper?你凭什么拿大厂Offer!!

    很多同学或多或少都用到了Zookeeper,并知道它能实现两个功能 配置中心,实现表分片规则的统一配置管理 注册中心,实现sharding-proxy节点的服务地址注册 那么Zookeeper到底是什 ...

  4. 【数据结构与算法Python版学习笔记】树——利用二叉堆实现优先级队列

    概念 队列有一个重要的变体,叫作优先级队列. 和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的. 优先级最高的元素在最前,优先级最低的元素在最后. 实现优先级队列的经典方法是使 ...

  5. 热身训练1 Problem B. Harvest of Apples

    http://acm.hdu.edu.cn/showproblem.php?pid=6333 题意: 求 C(0,n)+C(1,n)+...+C(m,n) 分析: 这道题,我们令s(m,n) = C( ...

  6. matlab添加永久路径

    addpath('D:\MATLAB6p5\toolbox\svm'); 临时添加路径,不能添加子目录 addpath(genpath('D:\MATLAB6p5\toolbox\svm'));临时添 ...

  7. 攻防世界 web5.disabled_button

    我觉得戴上手套按应该可以! 方法一: 打开网址,发现flag按钮无法点击,F12查看源代码,删除disabled=" ",flag就点击了. 方法二 POST请求, 先分析一下源代 ...

  8. DDD领域驱动设计-设计规范-Ⅵ

    不以规矩,不能成方圆.                                                                     -战国·邹·孟轲<孟子·离娄章句上 ...

  9. linux cut

    参考:Linux cut 命令详解_Linux_脚本之家 (jb51.net) 参考:cut命令_Linux cut 命令用法详解:连接文件并打印到标准输出设备上 (linuxde.net)

  10. i love dingning

    "如果你爱一个人,不是下课给人家买买水,不是短信发来发去,也不是周末一起出来唱唱歌聊聊天吃吃饭,而是做一个出色的人.以后的以后,可能还有别的人爱她,你要做的,是把别人都比下去.你要变得优秀, ...