bzoj 3277: 串
Description
字符串是oi界常考的问题。现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中
至少k个字符串的子串(注意包括本身)。
Solution
出现 \(k\) 次的问题比较好解决,我们构出 \(parent\) 树,然后在上面转移就可以了
但是在一个串出现多次只算一次,所以我们用 \(set\) 转移,自动去重
然后就是统计每一个串的每一个子串了
我们要在后缀自动机上遍历出所有 \(S\) 的子串
那么我们遍历每一个后缀节点,如果没有限制的话,对于所有遍历到的节点 \(x\),答案就是 \(\sum_{x} len[x]\)
对于限制,如果不满足 \(size[x]>=k\) ,我们暴力跳父亲节点,直到满足条件位置,然后继续做就行了
也可以不这么做:
我们把满足 \(size[x]>=k\) 的节点赋值为 \(len[x]-len[fa[x]]\),不满足的赋为 \(0\),然后把父亲的权值累加,直接访问每一个串的每一个位置所代表的节点,再累加起来就行了
关于 \(set\) 合并的复杂度问题:仿佛是个wei的
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+10;
int n,K,ch[N][26],fa[N];string s[N];
int cur,cnt=1,len[N],sz[N];set<int>S[N];set<int>::iterator it;
int head[N],nxt[N*2],to[N*2],num=0;
inline void link(int x,int y){nxt[++num]=head[x];to[num]=y;head[x]=num;}
inline void dfs(int x){
for(int i=head[x];i;i=nxt[i]){
int u=to[i];
dfs(u);
for(it=S[u].begin();it!=S[u].end();++it)S[x].insert(*it);
set<int>().swap(S[u]);
}
sz[x]=S[x].size();
}
inline void ins(int c,int id){
int p=cur;cur=++cnt;len[cur]=len[p]+1;
for(;p && !ch[p][c];p=fa[p])ch[p][c]=cur;
if(!p)fa[cur]=1;
else{
int q=ch[p][c];
if(len[p]+1==len[q])fa[cur]=q;
else{
int nt=++cnt;len[nt]=len[p]+1;
memcpy(ch[nt],ch[q],sizeof(ch[q]));
fa[nt]=fa[q];fa[q]=fa[cur]=nt;
for(;p && ch[p][c]==q;p=fa[p])ch[p][c]=nt;
}
}
S[cur].insert(id);
}
inline ll solve(int x){
ll ret=0;
for(int p=1,i=0,le=s[x].size();i<le;i++){
int c=s[x][i]-'a';
p=ch[p][c];
while(p>1 && sz[p]<K)p=fa[p];
ret+=len[p];
}
return ret;
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
scanf("%d%d",&n,&K);
for(int i=1;i<=n;i++){
cin>>s[i];
cur=1;
for(int j=0,le=s[i].size();j<le;j++)ins(s[i][j]-'a',i);
}
for(int i=2;i<=cnt;i++)link(fa[i],i);
dfs(1);
for(int i=1;i<=n;i++)printf("%lld ",solve(i));
return 0;
}
bzoj 3277: 串的更多相关文章
- BZOJ 3277 串 & BZOJ 3473 字符串 (广义后缀自动机、时间复杂度分析、启发式合并、线段树合并、主席树)
标签那么长是因为做法太多了... 题目链接: (bzoj 3277) https://www.lydsy.com/JudgeOnline/problem.php?id=3277 (bzoj 3473) ...
- BZOJ 3277 串 (广义后缀自动机)
3277: 串 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 309 Solved: 118 [Submit][Status][Discuss] De ...
- BZOJ 3277: 串/ BZOJ 3473: 字符串 ( 后缀数组 + RMQ + 二分 )
CF原题(http://codeforces.com/blog/entry/4849, 204E), CF的解法是O(Nlog^2N)的..记某个字符串以第i位开头的字符串对答案的贡献f(i), 那么 ...
- bzoj 3277 串 && bzoj 3473 字符串 && bzoj 2780 [Spoj]8093 Sevenk Love Oimaster——广义后缀自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3277 https://www.lydsy.com/JudgeOnline/problem.p ...
- bzoj 3277: 串 & bzoj 3473: 字符串【后缀自动机||后缀数组】
建一个广义后缀自动机(每加完一个串都返回root),在parent树上dpsum记录合法长度,打着时间戳往上跳,最后每个串在自动机上跑一变统计答案即可. 后缀数组理解起来可能方便一点,但是难写,就只说 ...
- bzoj 3277 串 后缀树+子树不同数个数
题目大意 给定\(n\)个字符串和\(k\) 对于每个字符串,输出它有多少个子串至少是\(k\)个字符串的子串(包括自己) 分析 建出广义后缀自动机 至少是\(k\)个字符串的子串就是求子树内不同数个 ...
- bzoj 3277
十分之恶心的后缀自动机 (其实是水题,但是我太弱了...) 首先,有一个预备知识:bzoj 2780https://blog.csdn.net/lleozhang/article/details/89 ...
- bzoj 3277 & bzoj 3473,bzoj 2780 —— 广义后缀自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3277 https://www.lydsy.com/JudgeOnline/problem.p ...
- BZOJ 4502: 串 AC自动机
4502: 串 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 195 Solved: 95[Submit][Status][Discuss] Des ...
随机推荐
- Beta冲刺NO.5
Beta冲刺 第五天 1. 昨天的困难 1.昨天的困难主要是在类的整理上,一些逻辑理不清,也有一些类写的太绝对了,扩展性就不那么好了,所以,昨天的困难就是在重构上. 页面结构太凌乱,之前没有统筹好具体 ...
- 弹幕视频播放app案例分析
产品 哔哩哔哩动画 相对于其他视频播放软件来说,哔哩哔哩动画没有广告影响观看体验,而且内容更偏重于二次元,因此我更倾向于使用它. 第一部分 调研, 评测 #第一次上手体验 用起来还是比较方便,可以快速 ...
- io多路复用(二)
服务端 import socket sk1 = socket.socket() sk1.bind(('127.0.0.1',8001,)) sk1.listen() inputs = [sk1,] i ...
- Hibernate之ORM与Hibernate
ORM: ORM是 Object /Relation Mapping,对象/关系数据库映射. 目前比较流行的编程语言,如java ,c#等,它们都是面向对象的编程语言,而目前比较主流的数据库产品,如O ...
- 北亚关于HP EVA4400/6400/8400/P6000的数据恢复解决方案
[引言]本文档建立在针对HP EVA的大量测试性研究基础上,所有的细节几乎均为对EVA的破译型研究,目前全球范围内尚未发现类似资料,故可能表述方式和结论并不精确,仅为参考之用.我们公司为研究HP EV ...
- Apache自带 ab压测工具 Windows配置使用说明 - 随笔记录
我们先来了解一下ab工具的概念,摘自网络: ab是apache自带的压力测试工具.ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试.比如ngin ...
- 我的PCB电路设计(一)
我的制板规则 过孔大小:14/24mil-(12/22-28/50) 一般过孔没必要太大.如果电流较大可以适当增大过孔,或者多加几个过孔 线宽大小:小信号线8mil,大电流线不等按1A电流30mil ...
- node express将请求重定向为https
项目开发时,由于服务器只接受https请求(运维说了算...),所以在生产环境时,要把所有http请求全都重定向为https,具体操作是在app.js文件里加入以下代码: var express = ...
- Struts2 配置文件小结
每次写的博文都被管理员都被移出首页,好气!还希望有哪位大神可以指点迷津-- struts2 配置文件的 result 节点 result 节点是 action 节点的子节点,他代表着 action 方 ...
- Python-字典、集合、字符编码、文件操作整理-Day3
1.字典 1.1.为什么有字典: 有个需求,存所有人的信息 这时候列表就不能轻易的表示完全names = ['stone','liang'] 1.2.元组: 定义符号()t = (1,2,3)tupl ...