传送门

调代码调的我怀疑人生。

启发式合并用迭代写怎么都跑不过(雾

换成了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: 字符串(后缀自动机+启发式合并)的更多相关文章

  1. loj#6041. 「雅礼集训 2017 Day7」事情的相似度(后缀自动机+启发式合并)

    题面 传送门 题解 为什么成天有人想搞些大新闻 这里写的是\(yyb\)巨巨说的启发式合并的做法(虽然\(LCT\)的做法不知道比它快到哪里去了--) 建出\(SAM\),那么两个前缀的最长公共后缀就 ...

  2. 2018.12.22 bzoj3277: 串(后缀自动机+启发式合并)

    传送门 跟这道题是一模一样的. 于是本蒟蒻又写了一遍10min1A庆祝 代码: #include<bits/stdc++.h> #define ri register int using ...

  3. 模板—字符串—后缀自动机(后缀自动机+线段树合并求right集合)

    模板—字符串—后缀自动机(后缀自动机+线段树合并求right集合) Code: #include <bits/stdc++.h> using namespace std; #define ...

  4. [TJOI2019]甲苯先生和大中锋的字符串——后缀自动机+差分

    题目链接: [TJOI2019]甲苯先生和大中锋的字符串 对原串建后缀自动机并维护$parent$树上每个点的子树大小,显然子树大小为$k$的节点所代表的子串出现过$k$次,那么我们需要将$[len[ ...

  5. LOJ#6503.「雅礼集训 2018 Day4」Magic[容斥+NTT+启发式合并]

    题意 \(n\) 张卡牌 \(m\) 种颜色,询问有多少种本质不同的序列满足相邻颜色相同的位置数量等于 \(k\). 分析 首先本质不同不好直接处理,可以将同种颜色的卡牌看作是不相同的,求出答案后除以 ...

  6. 2018.12.22 spoj7258 Lexicographical Substring Search(后缀自动机)

    传送门 samsamsam基础题. 题意简述:给出一个串,询问第kkk大的本质不同的串. 然而这就是弦论的简化版. 我们把samsamsam建出来然后贪心选择就行了. 代码: #include< ...

  7. 2018.12.22 bzoj3926: [Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机)

    传送门 题意简述:给出一棵trietrietrie树,每个点表示一个字符,求树上所有路径组成的不同字串数.(叶子数≤20\le 20≤20) 由于有一个神奇的条件,考虑以每一个叶子为树根统计每个点到树 ...

  8. BZOJ3473:字符串(后缀数组,主席树,二分,ST表)

    Description 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? Input 第一行两个整数n,k. 接下来n行每行一个字符串. Output 一 ...

  9. Wannafly Camp 2020 Day 2D 卡拉巴什的字符串 - 后缀自动机

    动态维护任意两个后缀的lcp集合的mex,支持在串末尾追加字符. Solution 考虑在 SAM 上求两个后缀的 LCP 的过程,无非就是找它们在 fail 树上的 LCA,那么 LCP 长度就是这 ...

随机推荐

  1. 基础DP(初级版)

    本文主要内容为基础DP,内容来源为<算法导论>,总结不易,转载请注明出处. 后续会更新出kuanbin关于基础DP的题目...... 动态规划: 动态规划用于子问题重叠的情况,即不同的子问 ...

  2. 网络编程Socket知识点回复

    Socket又称“套接字”,应用程序通常通过“套接字”向网络发出请求或者应答网络请求. Socket和ServerSocket类库位置java.net包中,ServerSocket用于服务器端,Soc ...

  3. 100-days: Three

    Title: Singapore(新加坡) set to raise retirement ages as seniors stay healthier be set to do sth.  准备做某 ...

  4. 如何成功再次安装MYSQL

    以前安过,后来再安装就是停在启动项就是过不去,无响应 弄了两天,期待奇迹,网上各种教程试了个遍就是不行,大体就是删除INI,清理注册表,以下是新的发现:(转载) 如果你的电脑里装过MySQL,想再重新 ...

  5. 关于json.stringify的注意事项

    今天通过navigator.getCurrentPosition中的success回调,用json.stringify打印postion时,怎么打印都只是一个{}, 而打印postion.coords ...

  6. java 线程Thread 技术--方法演示生产与消费模式

    利用wait 与notifyAll 方法进行演示生产与消费的模式的演示,我们两个线程负责生产,两个线程消费,只有生产了才能消费: 在effective Java 中有说过: 1. 在Java 中 ,使 ...

  7. javascript第一天知识点

    JS的数据类型: 数字  number 字符串 string 布尔 boolean 空值 null 未定义的 undefined 数组 Array 对象 Object 通过typeof() 可以查看对 ...

  8. cf相关命令

    进行登录的命令: cf login -a https://api.bupaas.citicsinfo.com --skip-ssl-validation 进行发布的命令: cf push gwdemo ...

  9. mysql 查看mysql相关信息

    登入数据库的时候: select @@version; select version(); 复制代码 mysql> select @@version; +-----------+ | @@ver ...

  10. Jmeter常用脚本开发之Java请求

    Java请求:就是用来对java项目的类进行压测 例子:将输入的两个参数通过IO存入文件 1.创建Java工程,工程目录如下 2.将Jmeter-lib下面的所有jar包导入java工程, 3.创建一 ...