luogu4595 [COCI2011-2012#5] POPLOCAVANJE 后缀自动机

看着就像后缀自动机....
然后搜了一下,网上一大把的\(AC\)自动机
嗯......
不管了,打一个试试
然后就过了\(QAQ\)
我们考虑对于每个点\(i\)求出它往前最长能匹配的子串的长度
可以对街道串建出后缀自动机
把所有的\(L\)在后缀自动机上走
走到的串就打个标记,最后顺着\(parent\)树下传一遍即可
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define ri register int
#define ll long long
#define rep(io, st, ed) for(ri io = st; io <= ed; io ++)
#define drep(io, ed, st) for(ri io = ed; io >= st; io --)
const int sid = 500060;
char s[sid];
int n, m, id = 1;
int fa[sid], mx[sid], val[sid], rig[sid];
int go[sid][26];
int extend(int lst, int c, int pos) {
int p = lst, np = ++ id;
rig[np] = pos; mx[np] = mx[p] + 1;
for( ; p && !go[p][c]; p = fa[p])
go[p][c] = np;
if(!p) fa[np] = 1;
else {
int q = go[p][c];
if(mx[p] + 1 == mx[q]) fa[np] = q;
else {
int nq = ++ id;
mx[nq] = mx[p] + 1;
fa[nq] = fa[q]; fa[np] = fa[q] = nq;
memcpy(go[nq], go[q], sizeof(go[q]));
for( ; p && go[p][c] == q; p = fa[p])
go[p][c] = nq;
}
}
return np;
}
void find(char *s) {
int n = strlen(s + 1);
int now = 1;
rep(i, 1, n) {
int opt = s[i] - 'a';
if(!go[now][opt]) return;
now = go[now][opt];
}
val[now] = max(val[now], n);
}
int nc[sid], ip[sid], na[sid];
void solve() {
rep(i, 1, id) nc[mx[i]] ++;
rep(i, 1, n) nc[i] += nc[i - 1];
rep(i, 1, id) ip[nc[mx[i]] --] = i;
rep(i, 1, id) {
int o = ip[i];
val[o] = max(val[o], val[fa[o]]);
if(rig[o]) {
int L = rig[o] - val[o] + 1, R = rig[o];
na[L] ++; na[R + 1] --;
}
}
rep(i, 1, n) na[i] += na[i - 1];
int ans = 0;
rep(i, 1, n) if(!na[i]) ans ++;
printf("%d\n", ans);
}
int main() {
cin >> n;
scanf("%s", s + 1);
int lst = 1;
rep(i, 1, n) lst = extend(lst, s[i] - 'a', i);
cin >> m;
rep(i, 1, m) {
scanf("%s", s + 1);
find(s);
}
solve();
return 0;
}
不知道为啥机房的人之后都写了后缀自动机....
luogu4595 [COCI2011-2012#5] POPLOCAVANJE 后缀自动机的更多相关文章
- [COCI2011-2012#5] POPLOCAVANJE 后缀自动机
题面:洛谷 题解: 其实还可以用AC自动机做,但是没调出来,,,不知道发生了什么... AC自动机做法如下: 观察到如果我们对给定的每个串建AC自动机,那么直接拿大串在上面匹配,如果遇到了一个单词的终 ...
- HDU 4436 str2int(后缀自动机)(2012 Asia Tianjin Regional Contest)
Problem Description In this problem, you are given several strings that contain only digits from '0' ...
- hdu4436-str2int(后缀数组 or 后缀自动机)
题意:给你一堆字符串,仅包含数字'0'到'9'. 例如 101 123 有一个字符串集合S包含输入的N个字符串,和他们的全部字串. 操作字符串很无聊,你决定把它们转化成数字. 你可以把一个字符串转换成 ...
- 后缀自动机(SAM)
*在学习后缀自动机之前需要熟练掌握WA自动机.RE自动机与TLE自动机* 什么是后缀自动机 后缀自动机 Suffix Automaton (SAM) 是一个用 O(n) 的复杂度构造,能够接受一个字符 ...
- 字符串(多串后缀自动机):HDU 4436 str2int
str2int Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total S ...
- 后缀自动机/回文自动机/AC自动机/序列自动机----各种自动机(自冻鸡) 题目泛做
题目1 BZOJ 3676 APIO2014 回文串 算法讨论: cnt表示回文自动机上每个结点回文串出现的次数.这是回文自动机的定义考查题. #include <cstdlib> #in ...
- 回文树&后缀自动机&后缀数组
KMP,扩展KMP和Manacher就不写了,感觉没多大意思. 之前感觉后缀自动机简直可以解决一切,所以不怎么写后缀数组. 马拉车主要是通过对称中心解决问题,有的时候要通过回文串的边界解决问题 ...
- HDU 1403 Longest Common Substring(后缀自动机——附讲解 or 后缀数组)
Description Given two strings, you have to tell the length of the Longest Common Substring of them. ...
- HDU 4436 (后缀自动机)
HDU 4436 str2int Problem : 给若干个数字串,询问这些串的所有本质不同的子串转换成数字之后的和. Solution : 首先将所有串丢进一个后缀自动机.由于这道题询问的是不同的 ...
随机推荐
- Linux服务-搭建NFS
任务目标:二进制安装nfs,作为共享存储挂载在三台web的网站根目录下,在任意一台web上修改的结果,其余两台都可以看到 首先来安装NFS服务,NFS顾名思义,就是极品飞车,哦不!是网络文件服务的意思 ...
- Linux基础-free窥内存-dd探硬盘
监控内存篇(RAM)-free free指令可以很直观的看到内存的使用情况 free -m指令以单位为MB的方式查看内存的使用情况(free命令读取的文件是/proc/meminfo) 这个表格的解释 ...
- HTTP请求方法 之 HEAD
HTTP请求方法并不是只有GET和POST,只是最常用的.据RFC2616标准(现行的HTTP/1.1)得知,通常有以下8种方法:OPTIONS.GET.HEAD.POST.PUT.DELETE.TR ...
- Electron 开发环境下总是 crash
全局安装一个 electron devtool 关掉 崩溃时选择重新打开
- Java学习笔记——继承、接口、多态
浮点数的运算需要注意的问题: BigDecimal operand1 = new BigDecimal("1.0"); BigDecimal operand2 = new BigD ...
- codepage 和 charset
codepage:简单地说,这是程序用于对字符进行编码的一个表.代码页是服务器的事情. 常见的三种codepage 简体中文 : 936 繁体中文 : 950 UTF-8 : 65001 如果你不想用 ...
- ORA-00906 missing left parenthesis括号
Oracle 建表报错:ORA-00906 missing left parenthesis括号 建表语句:create table test(id char,name varchar(1),s ...
- 用jquery实现toast的原理
function toast(mess){ var str='<div class="mess"><span></span></div&g ...
- mysql基准测试工具tpcc-mysql安装、使用、结果解读
TPCC是专门针对联机交易处理系统(OLTP系统)的规范,一般情况下我们也把这类系统称为业务处理系统,tpcc-mysql是percona基于TPC-C(下面简写成TPCC)衍生出来的产品,专用于My ...
- Tslib步骤以及出现问题的解决方案【转】
转自:http://forum.eepw.com.cn/thread/267828/1 嵌入式设备中触摸屏使用非常广泛,但触摸屏的坐标和屏的坐标是不对称的,需要校准.校准广泛使用的是开源的tslib. ...