bzoj3277
题解:
后缀自动机
然后抄了一发题解
可以看看这个博客: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的更多相关文章
- 【BZOJ3277】串(后缀自动机)
[BZOJ3277]串(后缀自动机) 题面 BZOJ 题解 广义后缀自动机??? 照着别人的打了一遍.. 相当于每个串都构建一个后缀自动机 构建完一个串之后,直接把当前的last指回root就行了?? ...
- BZOJ3277 串(后缀数组+二分答案+主席树)
因为不会SAM,考虑SA.将所有串连起来并加分隔符,每次考虑计算以某个位置开始的子串有多少个合法. 对此首先二分答案,找到名次数组上的一个区间,那么只需要统计有多少个所给串在该区间内出现就可以了.这是 ...
- [BZOJ3473][BZOJ3277]字符串
[BZOJ3473][BZOJ3277]字符串 试题描述 给定 \(n\) 个字符串,询问每个字符串有多少子串(不包括空串)是所有 \(n\) 个字符串中至少 \(k\) 个字符串的子串? 输入 第一 ...
- 【BZOJ3277/3473】串/字符串 后缀数组+二分+RMQ+双指针
[BZOJ3277]串 Description 字符串是oi界常考的问题.现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身). Inpu ...
- BZOJ3473&&BZOJ3277串
BZOJ3473&&BZOJ3277串 题面 自己找去 HINT 对于所有串建立一个广义后缀自动机,对于每一个节点开一个set表示这个节点接受的子串在哪些串里出现过,然后在parent ...
- [BZOJ3277/BZOJ3473] 串 - 后缀数组,二分,双指针,ST表,均摊分析
[BZOJ3277] 串 Description 现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身). Solution 首先将所有串连 ...
- BZOJ3277——串
0.题意:给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身). 1.分析:这个题我问了吴大爷做法 首先建立后缀自动机,然后利用离线搞出每一个 ...
- BZOJ3277 串 【后缀数组】【二分答案】【主席树】
题目分析: 用"$"连接后缀数组,然后做一个主席树求区间内不同的数的个数.二分一个前缀长度再在主席树上求不同的数的个数. 代码: #include<bits/stdc++.h ...
- bzoj3277 串 (后缀数组+二分答案+ST表)
常见操作:先把所有串都连到一起,但中间加上一个特殊的符号(不能在原串中/出现过)作为分割 由于全部的子串就等于所有后缀的所有前缀,那我们对于每一个后缀,去求一个最长的前缀,来满足这个前缀在至少K个原串 ...
随机推荐
- newborn, infant, toddler以及baby的区别
1.An infant (from the Latin word infans, meaning "unable to speak" or "speechless&quo ...
- Java se基础(类的属性及关键字)
public:说明该类的访问类型是公有的,它生成的对象能被其他的对象调用! abstract:用来声明抽象类! final;如果一个类被声明成final类型,那么就不能再由它派生出子类. 可以简单的看 ...
- 数据渲染模板引擎,template-web的使用
一:下载 template-web.js 下载地址:https://aui.github.io/art-template/zh-cn/docs/installation.html 二:引用: 三:ht ...
- redis安装配置:inux系统为centOS 64位
下载Redis-4.0.6.tar.gz包 我下载的到自己的默认目录/root/software/下 1. 然后解压到这个目录下 /usr/local/src/ 解压命令: tar -xzf redi ...
- 雷林鹏分享:C# 循环
C# 循环 有的时候,可能需要多次执行同一块代码.一般情况下,语句是顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推. 编程语言提供了允许更为复杂的执行路径的多种控制结构. 循环语句允 ...
- 协方差分析 | ANCOVA (Analysis of Covariance)
If you are worried about leaving out covariates you could regress out them first and analyse the res ...
- 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 ...
- uva11609
以三个人组队为例,3组合是:C(3,0)=1,3,3,1.还有队长的选择.有 1*0,3*1,3*2,1*3种. 组合数: 1 3 3 1 ...
- Canvas画板
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA6QAAAGgCAIAAAAy0z21AAAgAElEQVR4nO3dfYwkZ30n8JqZfcNex8
- android------Eclipse Memory Analyzer (MAT)
简单介绍 MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速.功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗. 使用内 ...