题解:

后缀自动机

然后抄了一发题解

可以看看这个博客: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. MySQL学习(十一)

    MySQL的函数 1 数学函数 2 字符串函数 3 日期和时间函数 4 条件判断函数 5 系统信息函数 6 加密解密函数 7 其他函数 2 字符串函数 length计算的是字节长度 char_leng ...

  2. unittest单元测试简单介绍

    unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...

  3. 雷林鹏分享:XML 命名空间

    XML 命名空间 XML 命名空间提供避免元素命名冲突的方法. 命名冲突 在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突. 这个 XML 携带 HTML ...

  4. 概率分布之间的推导关系 | Univariate Distribution Relationships

    Univariate Distribution Relationships APPL: A Probability Programming Language Maplesoft- Software f ...

  5. 中标麒麟Linux7 如何关闭广播消息

    chmod 600 /usr/libexec/sysnotify pkill -9 sysnotify

  6. patch-test-and-proc

    实验环境 Ubuntu 14.04.5 LTS Linux - 4.15.6 为单个文件进程补丁操作 在桌面 Desktop 建立文件夹 patch ,作为实验用,然后进入patch 文件夹.建立测试 ...

  7. Spring Boot 针对 Java 开发人员的安装指南

    Spring Boot 可以使用经典的开发工具或者使用安装的命令行工具.不管使用何种方式,你都需要确定你的 Java 版本为 Java SDK v1.8 或者更高的版本.在你开始安装之前,你需要确定你 ...

  8. Tensor RT使用记录

    Tensor RT的介绍在此不做赘述. 自己在服务器上本打算装Tensor RT来着,不过过程很艰辛,最后发现服务器的cudnn版本偏低了,还需要升级cudnn的版本.故,在自己的电脑上了装了下Ten ...

  9. Linux中计划任务、周期性任务设置

    Linux中计划任务.周期性任务设置 计划任务:指在未来的特定时间里,执行一次某一特定任务.当然,如果同一任务需要在不同时间点执行执行两次.三次或多次,可以视为多个一次看待. 周期性任务:指某一任务需 ...

  10. python:字典嵌套列表

    Python的字典{ }以键值对的形式保存数据,可以以键来访问字典中保存的值而不能用下标访问.字典中几乎可以包含任意的变量,字典,数列,元组.数列也一样. python的列表[ ]与字典不同,列表通过 ...