【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. python[error] - mysql_config not found

    具体报错信息: root@pts/4 $ pip install MySQL-python Collecting MySQL-python Using cached MySQL-python-1.2. ...

  2. 免费 Https 证书(Let's Encrypt)申请与配置

    之前要申请免费的 https 证书操作步骤相当麻烦,今天看到有人在讨论,就搜索了一下.发现现在申请步骤简单多了. 1. 下载 certbot git clone https://github.com/ ...

  3. Linux系统内存占用90%以上——解决方法

    Linux系统内存占用90%以上--解决方法   首先要明确一个问题:Linux系统内存占用90%以上,是否属于正常范围?网上有详细的解释,这属于正常现象~~~    www.2cto.com   L ...

  4. Trie树 字典树-学习笔记

    字符串--蒟蒻永远的阴影 对于字符串匹配 KMP很好的解决了以一个文本串匹配一个模板串的问题 但如果模板串有多个呢 这是KMP不再适用 我们引入一个新的数据结构--字典树 (当然又有像AC自动机这样更 ...

  5. Selenium+Python ---- 免登录、等待、unittest单元测试框架、PO模型

    1.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去 ...

  6. EF的Join()和Include()差异性教程

    在EF中表连接常用的有Join()和Include(),两者都可以实现两张表的连接,但又有所不同. 1.Join(),两表不必含有外键关系,需要代码手动指定连接外键相等(具有可拓展性,除了值相等,还能 ...

  7. springboot入门_模板

    springboot中已经不推荐使用jsp,而是推荐使用模板,如freemarker,thymeleaf等,本文记录在sprigboot中使用模板. 创建一个maven的springboot工程, f ...

  8. React Native填坑之旅 -- FlatList

    在React Native里有很多种方法来创建可滚动的list.比如,ScrollView和ListView.他们都各有优缺点.但是在React Native 0.43里增加了两种行的list vie ...

  9. ELK 经典用法—企业自定义日志手机切割和mysql模块

    本文收录在Linux运维企业架构实战系列 一.收集切割公司自定义的日志 很多公司的日志并不是和服务默认的日志格式一致,因此,就需要我们来进行切割了. 1.需切割的日志示例 2018-02-24 11: ...

  10. 【前端】Vue2全家桶案例《看漫画》之五、引入axios

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_5.html 项目github地址:https://github.com/shamoyuu/ ...