【BZOJ3277】串(后缀自动机)

题面

BZOJ

题解

广义后缀自动机???

照着别人的打了一遍。。

相当于每个串都构建一个后缀自动机

构建完一个串之后,直接把当前的last指回root就行了???

好吧,我觉得我看了一个假的广义后缀自动机。。

不过这道题这样就行了

考虑如何计算一个串在多少个母串中出现过?

考虑他的\(right\)集合中有多少个母串的结束位置就好了

那么,每个节点开个\(set\)存一下,然后按照拓扑序向上合并一次

因为\(parent\)包含的母串个数一定较大,

所以,对于每一个串计算答案

就把他直接丢到广义后缀自动机里面去

如果当前位置的\(size\),也就是包含的母串个数\(<K\)

就跳父亲

那么,当前位置产生的贡献就是\(longest\)

累加就好了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 220000
struct Line{int v,next;}e[MAX<<1];
int h[MAX<<1],cnt=1;
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
struct Node
{
int son[26];
int ff,len;
set<int> d;
}t[MAX<<1];
int size[MAX<<1];
int last,tot;
void init(){last=tot=1;}
void extend(int c,int id)
{
int p=last,np=++tot;last=np;
t[np].len=t[p].len+1;
t[np].d.insert(id);
while(p&&!t[p].son[c])t[p].son[c]=np,p=t[p].ff;
if(!p)t[np].ff=1;
else
{
int q=t[p].son[c];
if(t[q].len==t[p].len+1)t[np].ff=q;
else
{
int nq=++tot;
t[nq]=t[q];
t[nq].len=t[p].len+1;
t[q].ff=t[np].ff=nq;
while(p&&t[p].son[c]==q)t[p].son[c]=nq,p=t[p].ff;
}
}
}
void DFS(int u)
{
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;
DFS(v);
for(set<int>::iterator it=t[v].d.begin();it!=t[v].d.end();++it)
t[u].d.insert(*it);
}
size[u]=t[u].d.size();
}
int n,K;
string g[MAX];
int main()
{
ios::sync_with_stdio(false);
init();
cin>>n>>K;
for(int i=1;i<=n;++i)
{
cin>>g[i];
last=1;
for(int j=0,l=g[i].length();j<l;++j)extend(g[i][j]-97,i);
}
for(int i=1;i<=tot;++i)if(t[i].ff)Add(t[i].ff,i);
DFS(1);
if(K>n){for(int i=1;i<=n;++i)putchar('0'),putchar(' ');return 0;}
for(int i=1;i<=n;++i)
{
ll ans=0;
int now=1,len=g[i].length();
for(int j=0;j<len;++j)
{
now=t[now].son[g[i][j]-97];
while(size[now]<K)now=t[now].ff;
ans+=t[now].len;
}
printf("%lld ",ans);
}
return 0;
}

【BZOJ3277】串(后缀自动机)的更多相关文章

  1. BZOJ 2946: [Poi2000]公共串( 后缀自动机 )

    一个串建后缀自动机, 其他串在上面跑, 然后用当前串跑的去更新全部 ------------------------------------------------------------------ ...

  2. bzoj 2946 [Poi2000]公共串——后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2946 对每个串都建一个后缀自动机,然后 dfs 其中一个自动机,记录同步的话在别的自动机上走 ...

  3. 【bzoj2946】[Poi2000]公共串 后缀自动机

    [Poi2000]公共串 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1386  Solved: 620[Submit][Status][Discus ...

  4. BZOJ 2946 [Poi2000]公共串 ——后缀自动机

    任意选择一个串作为模式串,构建出后缀自动机. 然后用其他的串在后缀自动机上跑匹配. 然后就到了理解后缀自动机性质的时候. 在某一个节点的最大值是可以沿着parent树上传的. 然后用dp[i][j]表 ...

  5. bzoj 2946 公共串 —— 后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2946 建出 n-1 个后缀自动机一起跑呗. 代码如下: #include<cstdio ...

  6. bzoj3277 串 (后缀数组+二分答案+ST表)

    常见操作:先把所有串都连到一起,但中间加上一个特殊的符号(不能在原串中/出现过)作为分割 由于全部的子串就等于所有后缀的所有前缀,那我们对于每一个后缀,去求一个最长的前缀,来满足这个前缀在至少K个原串 ...

  7. BZOJ 2946 POI2000 公共串 后缀自动机(多串最长公共子串)

    题意概述:给出N个字符串,每个串的长度<=2000(雾...可能是当年的年代太久远机子太差了),问这N个字符串的最长公共子串长度为多少.(N<=5) 抛开数据结构,先想想朴素做法. 设计一 ...

  8. BZOJ 3676 [Apio2014]回文串 (后缀自动机+manacher/回文自动机)

    题目大意: 给你一个字符串,求其中回文子串的长度*出现次数的最大值 明明是PAM裸题我干嘛要用SAM做 回文子串有一个神奇的性质,一个字符串本质不同的回文子串个数是$O(n)$级别的 用$manach ...

  9. BZOJ2946 [Poi2000]公共串(后缀自动机)

    Description          给出几个由小写字母构成的单词,求它们最长的公共子串的长度. 任务: l        读入单词 l        计算最长公共子串的长度 l        输 ...

  10. BZOJ 3676: [Apio2014]回文串 后缀自动机 Manacher 倍增

    http://www.lydsy.com/JudgeOnline/problem.php?id=3676 过程很艰难了,第一次提交Manacher忘了更新p数组,超时,第二次是倍增的第0维直接在自动机 ...

随机推荐

  1. 为Docker配置阿里加速器,系统为Debian8

    先停止docker服务 service docker stop 设置阿里加速器 dockerd --registry-mirror=https://063eurcd.mirror.aliyuncs.c ...

  2. php 压缩函数gzencode gzdeflate gzcompress

    gzencode 默认使用ZLIB_ENCODING_GZIP编码,使用gzip压缩格式,实际上是使用defalte 算法压缩数据,然后加上文件头和adler32校验 gzdeflate 默认使用ZL ...

  3. Linux 虚拟IP

    虚拟IP Linux网卡上绑定另一个虚拟ip,即网卡上一个真实ip一个虚拟ip.当然通过这2个ip都可以连接到该主机. 实现原理主要是靠TCP/IP的ARP协议.因为ip地址只是一个逻辑 地址,在以太 ...

  4. [Python Study Notes] Basic I\O + File 操作

    列表操作 Python 文件I/O 本章只讲述所有基本的的I/O函数,更多函数请参考Python标准文档. 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式. ...

  5. LNMP搭建03 -- 编译安装PHP

    [编译安装PHP]  为了顺利安装PHP,先安装下面这些: [CentOS 编译 PHP 前要做的事情] yum install -y gcc gcc-c++  make zlib zlib-deve ...

  6. 【技术干货】git常用命令

    2.1 git init语法: git init在当前目录初始化git仓库,适用于尚未使用git管理的项目2.2 git clone语法: git clone <url>例如: git c ...

  7. dedecms data文件夹外迁

    出于网站安全考虑,我们一般要把data文件夹迁移到网站根目录外面. dedecms data文件夹外迁方法: 1. 修改首页文件中配置文件路径 打开/index.php,把代码 if(!file_ex ...

  8. 面试陷阱1:Integer类型的比较

    public class Test01 { public static void main(String[] args) { Integer f1 = 100, f2 = 100, f3 = 150, ...

  9. npm注意事项(附带Vue-cli安装)

    下载完nodeJS后,可选择更改配置目录 1.npm config set prefix "D:\node\node-global"<!--配置全局安装目录--> 2. ...

  10. ErrorKiller:Failed to decode response: zlib_decode(): data error

    先更新composer自己,composer self-update 然后再更新依赖关系 composer update