BZOJ 3473: 字符串 [广义后缀自动机]
3473: 字符串
Time Limit: 20 Sec Memory Limit: 256 MB
Submit: 354 Solved: 160
[Submit][Status][Discuss]
Description
Input
Output
研究了两节多课广义后缀自动机是什么,还看了2015国家队论文,然后发现,广义后缀自动机不就是把很多串的SAM建到了一个SAM上,建每个串的时候都从root开始(last=root)就行了........
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <string>
using namespace std;
const int N=2e5+;
typedef long long ll;
int n,k;
string s[N>>];
char ss[N>>];
struct node{
int ch[],par,val;
int cou,cur;
}t[N];
int sz=,root=,last=;
void extend(int c){
int p=last,np=++sz;
t[np].val=t[p].val+;
for(;p&&!t[p].ch[c];p=t[p].par) t[p].ch[c]=np;
if(!p) t[np].par=root;
else{
int q=t[p].ch[c];
if(t[q].val==t[p].val+) t[np].par=q;
else{
int nq=++sz;
t[nq]=t[q];t[nq].val=t[p].val+;
t[q].par=t[np].par=nq;
for(;p&&t[p].ch[c]==q;p=t[p].par) t[p].ch[c]=nq;
}
}
last=np;
}
int c[N],a[N];
ll f[N];
void RadixSort(){
for(int i=;i<=sz;i++) c[t[i].val]++;
for(int i=;i<=sz;i++) c[i]+=c[i-];
for(int i=sz;i>=;i--) a[c[t[i].val]--]=i;
}
void solve(){
int u;ll ans;
for(int i=;i<=n;i++){//printf("i %d\n",i);
u=root;
for(int j=;j<s[i].size();j++){
u=t[u].ch[s[i][j]-'a'];//printf("u %d %d %d\n",u,t[u].cou,j);
int p=u;
for(;p&&t[p].cur!=i;p=t[p].par) t[p].cou++,t[p].cur=i;
}
}
RadixSort();
for(int i=;i<=sz;i++) u=a[i];
t[].cou=;
for(int i=;i<=sz;i++) u=a[i],f[u]=f[t[u].par]+(t[u].cou>=k?t[u].val-t[t[u].par].val:);
for(int i=;i<=n;i++){
u=root;ans=;
for(int j=;j<s[i].size();j++){
u=t[u].ch[s[i][j]-'a'];
ans+=f[u];
}
printf("%lld ",ans);
}
}
int main(){
freopen("in","r",stdin);
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++){
scanf("%s",ss),s[i]=string(ss);
last=root;
for(int j=;j<s[i].size();j++) extend(s[i][j]-'a');
}
solve();
}
BZOJ 3473: 字符串 [广义后缀自动机]的更多相关文章
- BZOJ 3277 串 & BZOJ 3473 字符串 (广义后缀自动机、时间复杂度分析、启发式合并、线段树合并、主席树)
标签那么长是因为做法太多了... 题目链接: (bzoj 3277) https://www.lydsy.com/JudgeOnline/problem.php?id=3277 (bzoj 3473) ...
- BZOJ 3473 字符串 ——广义后缀自动机
这题就比较有趣了. 首先匹配一遍,然后统计子树叶子节点中包含大于等于k的节点个数(HH的项链) 然后就可以搞了. 关于合法的情况数,显然是l[i]-l[fa[i]],然后向下下传即可(YY一下). # ...
- bzoj 3277: 串 & bzoj 3473: 字符串【后缀自动机||后缀数组】
建一个广义后缀自动机(每加完一个串都返回root),在parent树上dpsum记录合法长度,打着时间戳往上跳,最后每个串在自动机上跑一变统计答案即可. 后缀数组理解起来可能方便一点,但是难写,就只说 ...
- BZOJ 3277 串 (广义后缀自动机)
3277: 串 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 309 Solved: 118 [Submit][Status][Discuss] De ...
- 【bzoj3277/bzoj3473】串/字符串 广义后缀自动机
题目描述 字符串是oi界常考的问题.现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身). 输入 第一行两个整数n,k.接下来n行每行一个 ...
- BZOJ 2894: 世界线 广义后缀自动机
Code: #include<bits/stdc++.h> #define maxn 300000 #define ll long long using namespace std; ve ...
- bzoj 3926 转换+广义后缀自动机
思路:重点在于叶子节点只有20个,我们把叶子节点提到根,把20个trie图插入后缀自动机,然后就是算有多少个本质不同的字串. #include<bits/stdc++.h> #define ...
- BZOJ 4180: 字符串计数 后缀自动机 + 矩阵乘法 + 二分(神题)
Description SD有一名神犇叫做Oxer,他觉得字符串的题目都太水了,于是便出了一道题来虐蒟蒻yts1999. 他给出了一个字符串T,字符串T中有且仅有4种字符 'A', 'B', 'C ...
- BZOJ3473 字符串 广义后缀自动机
今天主攻了下SAM 好多东西以前都没理解到 对于这道题 我们建一个自动机存所有串 每个穿last从1开始 对于自动机上每个点额外记一个cnt 表示能匹配到这个点的不同串个数 建完对每个串在自动机上匹配 ...
随机推荐
- MIT公开课:算法导论 笔记(一)
课程链接:http://open.163.com/special/opencourse/algorithms.html 第一课:算法分析基础 1.介绍插入排序与归并排序,计算并比较最坏运行时间 2.算 ...
- myEclipse配置SVN
方法三:直接解压 下载SVN插件:site-1.6.10.zip 解压后将其全部文件拷贝至:D:\Program Files\Genuitec\MyEclipse 8.5\drop ...
- JXLS 2.4.0系列教程(四)——多sheet是怎么做到的
注:本文代码在第一篇文章基础上修改而成,请务必先阅读第一篇文章. http://www.cnblogs.com/foxlee1024/p/7616987.html 本文也不会过多的讲解模板中遍历表达式 ...
- C++ enum用法小技巧
enum DeviceDataType :int { None = 0, SourceRGBA32 = 1, Keying = ...
- 01 mysql的安装(windows)
在安装mysql之前,一般是先下载mysql,推荐大家去Oracle的官网下载,而且尽量使用免安装的版本(即压缩版,解压之后就可以使用的版本,不是.exe的安装版本),因为安装版的mysql在安装过程 ...
- dedecms首页调用软件下载地址
这段时间利用dedecms开发一个软件下载的网站,应客户需求,需要在网站首页调用软件下载地址.在网上查找了一些资料,都没有很好的解决这个问题,后来自己研究了一下,就将自己的方法跟大家共享一下.有不好的 ...
- 利用光场进行深度图估计(Depth Estimation)算法之二——匹配算法
光场相机由于能够捕获相机内部光线的强度和方向而得到整个光场,可以实现重聚焦(refocus)和视角变换等功能.进而可以进行深度估计获取深度图,前面说过利用重聚焦的图像进行深度估计,今天说一下利用不同视 ...
- 新版Azure Automation Account 浅析(二) --- 更新Powershell模块和创建Runbook
前篇我们讲了怎样创建一个自动化账户以及创建时候"Run As Account"选项背后的奥秘.这一篇针对在Azure自动化账户中使用Powershell Runbook的用户讲一下 ...
- git分支小问题
参考网址:http://hbiao68.iteye.com/blog/2055493 1.查看分支 git branch 或者 git branch -v 2.创建一个新的分支 git branch ...
- 使用vue 遇到的问题————— 解决手机实时显示项目
Vue项目文件组织架构: src文件夹存放源代码. Static文件夹存放第三方静态资源. git将项目上传github http://blog.csdn.net/laozitianxia/ ...