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. 全场景效能平台猪齿鱼常用的前端css实现方案

    ​ 居中 最常用的height + line-height,以及margin:0 auto的居中方式就不再阐述,以下介绍两种容错性高的实现方案. flex布局实现 ​ 猪齿鱼前端日常开发中,我们多以f ...

  2. PHP伪协议与文件包含漏洞1

    PHP文件包含漏洞花样繁多,需配合代码审计. 看能否使用这类漏洞时,主要看: (1)代码中是否有include(),且参数可控: 如: (2)php.ini设置:确保 allow_url_fopen= ...

  3. Prometheus基于文件的服务发现

    Prometheus基于文件的服务发现 一.基于文件的服务发现 1.prometheus.yml 配置文件的写法 2.file_sd 目录下的文件 3.配置结果 二.注意事项 三.参考链接 一.基于文 ...

  4. iPhone SE切换颜色特效

    Apple 网站的特效, iPhone SE 共有黑.白.红三种颜色,在卷动页面的时候会逐步替换,看起来效果非常时尚,在此供上代码学习. <!DOCTYPE html> <html& ...

  5. 算法:N-皇后问题

    一.八皇后问题 八皇后问题是一个以国际象棋为背景的问题:如何能够在8 × 8 的国际象棋棋盘上放置八个皇后(Queen),使得任何一个皇后都无法直接吃掉其他的皇后.为了达到此目的,任两个皇后都不能处于 ...

  6. 查找最小生成树:克鲁斯克尔算法(Kruskal)算法

    一.算法介绍 Kruskal算法是一种用来查找最小生成树的算法,由Joseph Kruskal在1956年发表.用来解决同样问题的还有Prim算法和Boruvka算法等.三种算法都是贪心算法的应用.和 ...

  7. 进程间通信消息队列msgsnd执行:Invlid argument——万恶的经验主义

    最近在搞进程间通信,首先在我的ubuntu 14.04上写了接口和测试demo,编译和执行都OK,,代码如下: 接口文件ipcmsg.h /* ipcmsg.h */ #ifndef H_MSGIPC ...

  8. AGC036 A-Triangle | 构造

    题目链接 题意: 给出一个数$S(1\leqslant S \leqslant 10^{18})$. 要求在平面直角坐标系中找到三个点$(X_1,Y_1),(X_2,Y_2),(X_3,Y_3)$,满 ...

  9. ReplacingMergeTree:实现Clickhouse数据更新

    摘要:Clickhouse作为一个OLAP数据库,它对事务的支持非常有限.本文主要介绍通过ReplacingMergeTree来实现Clickhouse数据的更新.删除. 本文分享自华为云社区< ...

  10. 纯 CSS 自定义多行省略:从原理到实现

    文字溢出怎么展示,你的需求是什么?单行还是多行?截断,省略,自定义样式,自适应高度?在这里你都能找到答案.接下来我会由浅入深,从原理到实现,带你一步步揭开多行省略的面纱.我们先从最简单的单行溢出省略开 ...