题解:

后缀自动机

然后抄了一发题解

可以看看这个博客: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. newborn, infant, toddler以及baby的区别

    1.An infant (from the Latin word infans, meaning "unable to speak" or "speechless&quo ...

  2. Java se基础(类的属性及关键字)

    public:说明该类的访问类型是公有的,它生成的对象能被其他的对象调用! abstract:用来声明抽象类! final;如果一个类被声明成final类型,那么就不能再由它派生出子类. 可以简单的看 ...

  3. 数据渲染模板引擎,template-web的使用

    一:下载 template-web.js 下载地址:https://aui.github.io/art-template/zh-cn/docs/installation.html 二:引用: 三:ht ...

  4. redis安装配置:inux系统为centOS 64位

    下载Redis-4.0.6.tar.gz包 我下载的到自己的默认目录/root/software/下 1. 然后解压到这个目录下 /usr/local/src/ 解压命令: tar -xzf redi ...

  5. 雷林鹏分享:C# 循环

    C# 循环 有的时候,可能需要多次执行同一块代码.一般情况下,语句是顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推. 编程语言提供了允许更为复杂的执行路径的多种控制结构. 循环语句允 ...

  6. 协方差分析 | ANCOVA (Analysis of Covariance)

    If you are worried about leaving out covariates you could regress out them first and analyse the res ...

  7. 11月29日 The Rails philosophy 完成rails on guide 的第一章getting started with rails

    the rails philosophy includes two major guiding principles: Don't repeat yourself: DRY is a principl ...

  8. uva11609

    以三个人组队为例,3组合是:C(3,0)=1,3,3,1.还有队长的选择.有 1*0,3*1,3*2,1*3种. 组合数:            1      3        3        1 ...

  9. Canvas画板

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA6QAAAGgCAIAAAAy0z21AAAgAElEQVR4nO3dfYwkZ30n8JqZfcNex8

  10. android------Eclipse Memory Analyzer (MAT)

    简单介绍 MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速.功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗. 使用内 ...