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 : 首先将所有串丢进一个后缀自动机.由于这道题询问的是不同的 ...
随机推荐
- Python练习-time模块
明天的明天的明天,雾草! # 编辑者:闫龙 #显示当前时间三天后是星期几? import time t = time.time()+((24*3600)*3) tl = time.localtime( ...
- 【JSON】Ajax获得JSON字符串的处理方法
一. success : function(data){ var caseInfoView = eval('('+data.caseInfoView+')'); for(var key in case ...
- 利用python编写不同环境下都能运行的测试脚本
利用bash来获取当前电脑的环境变量,可以写一个.sh文件,里面获取当前环境,然后在调用python文件执行 # -*- coding: utf-8 -*- import logging import ...
- MySQL分布式集群之MyCAT(三)rule的分析【转】
首先写在最前面,MyCAT1.4的alpha版本已经发布了,这里面修复了不少的bug,也完善了一细节,之前两篇博客已经做了一些修改 ---------------------------------- ...
- Linux下MySQL/MariaDB Galera集群搭建过程【转】
MariaDB介绍 MariaDB是开源社区维护的一个MySQL分支,由MySQL的创始人Michael Widenius主导开发,采用GPL授权许可证. MariaDB的目的是完全兼容MySQL,包 ...
- 产看Linux运行时间
Linux下如何查看系统启动时间和运行时间 1.uptime命令输出:16:11:40 up 59 days, 4:21, 2 users, load average: 0.00, 0.01, 0.0 ...
- IPC对象的持续性
转载:http://book.51cto.com/art/201006/207275.htm <UNIX网络编程:第2版.第2卷,进程间通信>本书全面深入地讲解了各种进程间通信形式,包括消 ...
- mysql 导出数据库命令
mysqldump --socket=/data/mysql/mysql.sock -uroot -pfanzhuo -d stat1> stat1.sql
- 解决mysql不能远程登入的问题
mysql远程不能登入,问题就在于当时设置的账号只限制本地访问,mysql默认也只是本地访问. 之前的设置: 通过命令行登录管理MySQL服务器(提示输入密码时直接回车): mysql> /us ...
- Radon变换——MATLAB
算法说明: 图像的Radon变换是每个像素的Radon变换的总和. 该算法首先将图像中的像素分成四个子像素,并分别投影每个子像素,如下图所示. 根据投影位置和箱体中心之间的距离,每个子像素的贡献按比例 ...