2018.12.22 bzoj3473: 字符串(后缀自动机+启发式合并)
传送门
调代码调的我怀疑人生。
启发式合并用迭代写怎么都跑不过(雾
换成了dfsdfsdfs版本的终于过了233.
题意简述:求给出nnn个字串,对于每个给定的字串求出其有多少个字串在至少kkk个剩下字串中出现过。
显然先对所有字串建一个samsamsam出来,然后对于每个状态用一个setsetset维护在哪些字串里面出现过(这个显然需要在建完parentparentparent树之后启发式合并一波),最后拿每个串在上面匹配,如果当前的状态不满足题意就沿着树边向上跳即可。
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int M=2e5+5;
int k,T;
string s[M];
typedef long long ll;
struct SAM{
int last,tot,len[M],son[M][26],link[M],cnt[M],rk[M],val[M];
set<int>S[M];
vector<int>e[M];
SAM(){last=tot=1,len[0]=-1,fill(son[0],son[0]+26,1);}
inline void expand(int x,int id){
int p=last,np=++tot;
S[last=np].insert(id),len[np]=len[p]+1;
while(p&&!son[p][x])son[p][x]=np,p=link[p];
if(!p){link[np]=1;return;}
int q=son[p][x],nq;
if(len[q]==len[p]+1){link[np]=q;return;}
len[nq=++tot]=len[p]+1,memcpy(son[nq],son[q],sizeof(son[q])),link[nq]=link[q];
while(p&&son[p][x]==q)son[p][x]=nq,p=link[p];
link[q]=link[np]=nq;
}
inline void merge(int u,int v){
if(S[u].empty()||S[v].empty())return;
for(set<int>::iterator it=S[v].begin();it!=S[v].end();++it)S[u].insert(*it);
}
inline void dfs(int p){
for(ri i=0,v;i<e[p].size();++i){
dfs(v=e[p][i]);
if(S[p].size()<S[v].size())swap(S[p],S[v]);
for(set<int>::iterator it=S[v].begin();it!=S[v].end();++it)S[p].insert(*it);
}
val[p]=S[p].size();
}
inline void solve(){
for(ri i=1;i<=tot;++i)if(link[i])e[link[i]].push_back(i);
dfs(1);
}
inline ll query(int id){
int p=1,up=s[id].size(),nowlen=0;
ll ret=0;
for(ri i=0;i<up;++i){
p=son[p][s[id][i]-'a'];
while(val[p]<k)p=link[p];
ret+=len[p];
}
return ret;
}
}sam;
int main(){
scanf("%d%d",&T,&k);
for(ri i=1,n;i<=T;++i){
cin>>s[i];
n=s[i].size();
for(ri j=0;j<n;++j)sam.expand(s[i][j]-'a',i);
sam.last=1;
}
if(k>T){for(ri i=1;i<=T;++i)cout<<"0 ";return 0;}
sam.solve();
for(ri i=1;i<=T;++i)cout<<sam.query(i)<<' ';
return 0;
}
2018.12.22 bzoj3473: 字符串(后缀自动机+启发式合并)的更多相关文章
- loj#6041. 「雅礼集训 2017 Day7」事情的相似度(后缀自动机+启发式合并)
题面 传送门 题解 为什么成天有人想搞些大新闻 这里写的是\(yyb\)巨巨说的启发式合并的做法(虽然\(LCT\)的做法不知道比它快到哪里去了--) 建出\(SAM\),那么两个前缀的最长公共后缀就 ...
- 2018.12.22 bzoj3277: 串(后缀自动机+启发式合并)
传送门 跟这道题是一模一样的. 于是本蒟蒻又写了一遍10min1A庆祝 代码: #include<bits/stdc++.h> #define ri register int using ...
- 模板—字符串—后缀自动机(后缀自动机+线段树合并求right集合)
模板—字符串—后缀自动机(后缀自动机+线段树合并求right集合) Code: #include <bits/stdc++.h> using namespace std; #define ...
- [TJOI2019]甲苯先生和大中锋的字符串——后缀自动机+差分
题目链接: [TJOI2019]甲苯先生和大中锋的字符串 对原串建后缀自动机并维护$parent$树上每个点的子树大小,显然子树大小为$k$的节点所代表的子串出现过$k$次,那么我们需要将$[len[ ...
- LOJ#6503.「雅礼集训 2018 Day4」Magic[容斥+NTT+启发式合并]
题意 \(n\) 张卡牌 \(m\) 种颜色,询问有多少种本质不同的序列满足相邻颜色相同的位置数量等于 \(k\). 分析 首先本质不同不好直接处理,可以将同种颜色的卡牌看作是不相同的,求出答案后除以 ...
- 2018.12.22 spoj7258 Lexicographical Substring Search(后缀自动机)
传送门 samsamsam基础题. 题意简述:给出一个串,询问第kkk大的本质不同的串. 然而这就是弦论的简化版. 我们把samsamsam建出来然后贪心选择就行了. 代码: #include< ...
- 2018.12.22 bzoj3926: [Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机)
传送门 题意简述:给出一棵trietrietrie树,每个点表示一个字符,求树上所有路径组成的不同字串数.(叶子数≤20\le 20≤20) 由于有一个神奇的条件,考虑以每一个叶子为树根统计每个点到树 ...
- BZOJ3473:字符串(后缀数组,主席树,二分,ST表)
Description 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? Input 第一行两个整数n,k. 接下来n行每行一个字符串. Output 一 ...
- Wannafly Camp 2020 Day 2D 卡拉巴什的字符串 - 后缀自动机
动态维护任意两个后缀的lcp集合的mex,支持在串末尾追加字符. Solution 考虑在 SAM 上求两个后缀的 LCP 的过程,无非就是找它们在 fail 树上的 LCA,那么 LCP 长度就是这 ...
随机推荐
- 基础DP(初级版)
本文主要内容为基础DP,内容来源为<算法导论>,总结不易,转载请注明出处. 后续会更新出kuanbin关于基础DP的题目...... 动态规划: 动态规划用于子问题重叠的情况,即不同的子问 ...
- 网络编程Socket知识点回复
Socket又称“套接字”,应用程序通常通过“套接字”向网络发出请求或者应答网络请求. Socket和ServerSocket类库位置java.net包中,ServerSocket用于服务器端,Soc ...
- 100-days: Three
Title: Singapore(新加坡) set to raise retirement ages as seniors stay healthier be set to do sth. 准备做某 ...
- 如何成功再次安装MYSQL
以前安过,后来再安装就是停在启动项就是过不去,无响应 弄了两天,期待奇迹,网上各种教程试了个遍就是不行,大体就是删除INI,清理注册表,以下是新的发现:(转载) 如果你的电脑里装过MySQL,想再重新 ...
- 关于json.stringify的注意事项
今天通过navigator.getCurrentPosition中的success回调,用json.stringify打印postion时,怎么打印都只是一个{}, 而打印postion.coords ...
- java 线程Thread 技术--方法演示生产与消费模式
利用wait 与notifyAll 方法进行演示生产与消费的模式的演示,我们两个线程负责生产,两个线程消费,只有生产了才能消费: 在effective Java 中有说过: 1. 在Java 中 ,使 ...
- javascript第一天知识点
JS的数据类型: 数字 number 字符串 string 布尔 boolean 空值 null 未定义的 undefined 数组 Array 对象 Object 通过typeof() 可以查看对 ...
- cf相关命令
进行登录的命令: cf login -a https://api.bupaas.citicsinfo.com --skip-ssl-validation 进行发布的命令: cf push gwdemo ...
- mysql 查看mysql相关信息
登入数据库的时候: select @@version; select version(); 复制代码 mysql> select @@version; +-----------+ | @@ver ...
- Jmeter常用脚本开发之Java请求
Java请求:就是用来对java项目的类进行压测 例子:将输入的两个参数通过IO存入文件 1.创建Java工程,工程目录如下 2.将Jmeter-lib下面的所有jar包导入java工程, 3.创建一 ...