题解:

后缀自动机

然后抄了一发题解

可以看看这个博客:http://blog.csdn.net/clover_hxy/article/details/53861268

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=;
typedef long long ll;
int n,m,np,nq,p,q,cnt,root,last,len,sz,ch[N][],fa[N];
int size[N],l[N],nxt[N],a[N],now,pd[N],mark[N],v[N],pos[N];
int point[N],next[N],vi[N],tot,tt,head[N],nt[N];
ll c[N];
char s[N];
void add(int x,int y)
{
next[++tot]=point[x];
point[x]=tot;
vi[tot]=y;
}
void addfa(int x,int y)
{
nt[++tt]=head[x];
head[x]=tt;
v[tt]=y;
}
void extend(int x)
{
int c=a[x];
p=last;
np=++cnt;
last=np;
l[np]=l[p]+;
for (;p&&!ch[p][c];p=fa[p])ch[p][c]=np;
if (!p)fa[np]=root;
else
{
q=ch[p][c];
if (l[q]==l[p]+)fa[np]=q;
else
{
nq=++cnt;
l[nq]=l[p]+;
memcpy(ch[nq],ch[q],sizeof ch[nq]);
size[nq]=size[q];
nxt[nq]=nxt[q];
fa[nq]=fa[q];
fa[q]=fa[np]=nq;
for (;ch[p][c]==q;p=fa[p])ch[p][c]=nq;
}
}
add(now,np);
for (;np;np=fa[np])
if (nxt[np]!=now)
{
nxt[np]=now;
size[np]++;
}
else break;
}
void dfs(int x)
{
c[x]+=c[fa[x]];
for (int i=head[x];i;i=nt[i])dfs(v[i]);
}
int main()
{
scanf("%d%d",&n,&m);
root=++cnt;
for (int i=;i<=n;i++)
{
scanf("%s",s+);
last=root;
len=strlen(s+);
now=i;
for (int j=;j<=len;j++)
a[++sz]=s[j]-'a',extend(sz);
mark[i]=sz;
}
for (int i=;i<=cnt;i++)v[l[i]]++;
for (int i=;i<=cnt;i++)v[i]+=v[i-];
for (int i=;i<=cnt;i++)pos[v[l[i]]--]=i;
for (int i=;i<=cnt;i++)
{
int t=pos[i];
addfa(fa[t],t);
if (size[t]>=m)c[t]=(ll)(l[t]-l[fa[t]]);
else c[t]=;
}
c[]=;
dfs();
for (int i=;i<=n;i++)
{
ll ans=;
for (int j=point[i];j;j=next[j])ans+=c[vi[j]];
printf("%lld ",ans);
}
}

bzoj3277的更多相关文章

  1. 【BZOJ3277】串(后缀自动机)

    [BZOJ3277]串(后缀自动机) 题面 BZOJ 题解 广义后缀自动机??? 照着别人的打了一遍.. 相当于每个串都构建一个后缀自动机 构建完一个串之后,直接把当前的last指回root就行了?? ...

  2. BZOJ3277 串(后缀数组+二分答案+主席树)

    因为不会SAM,考虑SA.将所有串连起来并加分隔符,每次考虑计算以某个位置开始的子串有多少个合法. 对此首先二分答案,找到名次数组上的一个区间,那么只需要统计有多少个所给串在该区间内出现就可以了.这是 ...

  3. [BZOJ3473][BZOJ3277]字符串

    [BZOJ3473][BZOJ3277]字符串 试题描述 给定 \(n\) 个字符串,询问每个字符串有多少子串(不包括空串)是所有 \(n\) 个字符串中至少 \(k\) 个字符串的子串? 输入 第一 ...

  4. 【BZOJ3277/3473】串/字符串 后缀数组+二分+RMQ+双指针

    [BZOJ3277]串 Description 字符串是oi界常考的问题.现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身). Inpu ...

  5. BZOJ3473&&BZOJ3277串

    BZOJ3473&&BZOJ3277串 题面 自己找去 HINT 对于所有串建立一个广义后缀自动机,对于每一个节点开一个set表示这个节点接受的子串在哪些串里出现过,然后在parent ...

  6. [BZOJ3277/BZOJ3473] 串 - 后缀数组,二分,双指针,ST表,均摊分析

    [BZOJ3277] 串 Description 现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身). Solution 首先将所有串连 ...

  7. BZOJ3277——串

    0.题意:给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身). 1.分析:这个题我问了吴大爷做法 首先建立后缀自动机,然后利用离线搞出每一个 ...

  8. BZOJ3277 串 【后缀数组】【二分答案】【主席树】

    题目分析: 用"$"连接后缀数组,然后做一个主席树求区间内不同的数的个数.二分一个前缀长度再在主席树上求不同的数的个数. 代码: #include<bits/stdc++.h ...

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

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

随机推荐

  1. 基于python Arcface 实现人脸检测和识别

    虹软的人脸识别技术也是很强的,重要的是他免费提供了离线的sdk,还提供了实例,这个是目前几家研究人脸识别的大公司里面少有的.识别能力正常用还是可以的.我这个代码是调用的离线sdk实现的 ``` fro ...

  2. 使用http://start.spring.io/ 生成工程

    今天学习spring-cloud,无意中发现一个spring提供的构建工程的页面,想记录下,发现有个博客写的很好就直接抄过来了.  原文链接: https://blog.csdn.net/u01050 ...

  3. python中集合及运算

    一.集合set()的特点: 集合的特点:有的可变,有的不可变:元素无次序,不可重复. 集合中的元素不能重复,可作为一种简单高效的元素去重方式. 集合没有索引,它的元素无次序,不是序列. 利用set() ...

  4. (7)Pool进程池

    (1)# 开启过多的进程并不一定提高你的效率 因为进程池可以实现并行的概念,比Process单核并发的速度要快 # 如果cpu负载任务过多,平均单个任务执行的效率就会低,反而降低执行速度. 1个人做4 ...

  5. R语言函数总结(转)

    R语言特征 对大小写敏感 通常,数字,字母,. 和 _都是允许的(在一些国家还包括重音字母).不过,一个命名必须以 . 或者字母开头,并且如果以 . 开头,第二个字符不允许是数字. 基本命令要么是表达 ...

  6. layui 日期插件onchange事件失效的方法

    laydate.render({ elem:'#text1',//制定元素 type:'date', //range:true,//开启左右面板 min:'2017-09-1',// max:'201 ...

  7. android -------- Data Binding的使用(一)

    Google推出自己官方的数据绑定框架Data Binding Library 已经很久了,很多企业也在使用 面试的时候也有问到,所以也去学习了一番,特来分享一下,希望对各位有所帮助 描述: Data ...

  8. mysql常用修改创建语句

    一.连接数据库 <?php $dbhost = 'localhost:3306'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = ...

  9. CentOS7 下源代码安装php7

    安装PHP7: php-7.1.2.tar.gz:下载:wget http://cn2.php.net/get/php-7.1.2.tar.gz/from/this/mirror 安装php: # t ...

  10. K8S各知识点整理

    一.k8s组成部分 Master 1.   kube-apiserver 封装了核心对象的增删改查操作,以REST API接口方式提供给外部和内部组件调用.它维护的REST对象将持久化到Etcd中 2 ...