BZOJ 3473
思路:
CF原题
ZYF有题解
O(nlog^2n)
- //By SiriusRen
- #include <bits/stdc++.h>
- using namespace std;
- const int N=;
- int n,m,q,cntA[N],cntB[N],A[N],B[N],rk[N],ht[N],sa[N],tsa[N],f[N][];
- int from[N],cnt[N],rec[N],tl[N],ans[N];
- char ch[N],s[N];
- void SA(){
- for(int i=;i<=n;i++)cntA[s[i]]++;
- for(int i=;i<=;i++)cntA[i]+=cntA[i-];
- for(int i=n;i;i--)sa[cntA[s[i]]--]=i;
- rk[sa[]]=;
- for(int i=;i<=n;i++)rk[sa[i]]=rk[sa[i-]]+(s[sa[i]]!=s[sa[i-]]);
- for(int l=;rk[sa[n]]<n;l<<=){
- memset(cntA,,sizeof(cntA));
- memset(cntB,,sizeof(cntB));
- for(int i=;i<=n;i++)cntA[A[i]=rk[i]]++,cntB[B[i]=(i+l<=n?rk[i+]:)]++;
- for(int i=;i<=n;i++)cntA[i]+=cntA[i-],cntB[i]+=cntB[i-];
- for(int i=n;i;i--)tsa[cntB[B[i]]--]=i;
- for(int i=n;i;i--)sa[cntA[A[tsa[i]]]--]=tsa[i];
- rk[sa[]]=;
- for(int i=;i<=n;i++)rk[sa[i]]=rk[sa[i-]]+(A[sa[i]]!=A[sa[i-]]||B[sa[i]]!=B[sa[i-]]);
- }
- for(int i=,j=;i<=n;i++){
- j=j?j-:;
- while(s[i+j]==s[sa[rk[i]-]+j])j++;
- ht[rk[i]]=j;
- }
- for(int i=;i<=n;i++)f[i][]=ht[i];
- for(int j=;j<=;j++)
- for(int i=;i<=n;i++)
- f[i][j]=min(f[i][j-],f[i+(<<(j-))][j-]);
- }
- bool check(int pos,int len){
- int l=pos,r=pos;
- for(int j=;~j;j--){
- if(l+>=(<<j)&&f[l+-(<<j)][j]>=len)l-=(<<j);
- if(f[r+][j]>=len)r+=(<<j);
- }return rec[r]>=l;
- }
- int main(){
- scanf("%d%d",&m,&q);
- for(int i=;i<=m;i++){
- scanf("%s",ch);
- int t=strlen(ch);
- s[n++]=' ';
- for(int j=;j<t;j++)from[n]=i,s[n++]=ch[j];
- tl[i]=n;
- }n--,s[]=;SA();
- int t=,k=;
- for(int i=;i<=n;i++)if(from[sa[i]]){
- if(!cnt[from[sa[i]]])k++;
- cnt[from[sa[i]]]++;
- if(k>=q){
- for(;k-(cnt[from[sa[t]]]==)>=q;k-=(cnt[from[sa[t]]]==),--cnt[from[sa[t++]]]);
- rec[i]=t;
- }
- }
- for(int i=;i<=n;i++)if(from[sa[i]]){
- int l=,r=tl[from[sa[i]]]-sa[i],dt=;
- while(l<=r){
- int mid=(l+r)>>;
- if(check(i,mid))dt=mid,l=mid+;
- else r=mid-;
- }ans[from[sa[i]]]+=dt;
- }
- for(int i=;i<=m;i++)printf("%d ",ans[i]);
- }
BZOJ 3473的更多相关文章
- 【BZOJ 3473】 字符串 (后缀数组+RMQ+二分 | 广义SAM)
3473: 字符串 Description 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? Input 第一行两个整数n,k. 接下来n行每行一个字符串 ...
- BZOJ 3277 串 & BZOJ 3473 字符串 (广义后缀自动机、时间复杂度分析、启发式合并、线段树合并、主席树)
标签那么长是因为做法太多了... 题目链接: (bzoj 3277) https://www.lydsy.com/JudgeOnline/problem.php?id=3277 (bzoj 3473) ...
- bzoj 3473 字符串 - 后缀数组 - 树状数组
题目传送门 传送门 题目大意 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串 先用奇怪的字符把所有字符串连接起来. 建后缀树,数每个节点的子树内包含多少属 ...
- BZOJ 3473: 字符串 [广义后缀自动机]
3473: 字符串 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 354 Solved: 160[Submit][Status][Discuss] ...
- bzoj 3277 串 && bzoj 3473 字符串 && bzoj 2780 [Spoj]8093 Sevenk Love Oimaster——广义后缀自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3277 https://www.lydsy.com/JudgeOnline/problem.p ...
- bzoj 3473 后缀自动机多字符串的子串处理方法
后缀自动机处理多字符串字串相关问题. 首先,和后缀数组一样,用分割符连接各字符串,然后建一个后缀自动机. 我们定义一个节点代表的字符串为它原本代表的所有串去除包含分割符后的串.每个节点代表的字符串的数 ...
- bzoj 3277 & bzoj 3473,bzoj 2780 —— 广义后缀自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3277 https://www.lydsy.com/JudgeOnline/problem.p ...
- BZOJ 3277: 串/ BZOJ 3473: 字符串 ( 后缀数组 + RMQ + 二分 )
CF原题(http://codeforces.com/blog/entry/4849, 204E), CF的解法是O(Nlog^2N)的..记某个字符串以第i位开头的字符串对答案的贡献f(i), 那么 ...
- BZOJ 3473 字符串
思路 广义SAM的题目,先全部插入,然后每个字符串在SAM上匹配,如果发现当前sz小于k(就是前缀不满足条件),就跳fail(找前缀的后缀,就是找子串)到满足条件为止,然后一个满足条件的节点,它的所有 ...
- BZOJ 3473: 字符串 (广义后缀自动机)
/* 广义后缀自动机, 每次加入维护 该right集合的set, 然后可以更新所有的parent,最终能够出现在k个串中right集合也就是set大小大于等于k的部分 这样的话就给了我们要跳的节点加了 ...
随机推荐
- chrome浏览器安装网页测试插件postman的图文介绍
用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法来跟踪网页请求的,用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具.今天给大家介绍的这款网页调试工具不仅可以 ...
- MessageFormat理解,MessageFormat.format(Object obj)方法
MessageFormat.format(Object obj)方法主要用途为拼接message信息 用法: Object[] testArgs = {new String("张三" ...
- RequestMapping_Ant 路径
[使用@RequestMapping映射请求] [Ant风格资源地址支持3种匹配符] (1)? :匹配文件名中的一个字符. (2) * :匹配文件名中的任意字符. (3) ** :**匹配多层路径. ...
- Win32编程API 基础篇 -- 6.菜单和图标
菜单和按钮 例子:菜单1 本小节仅仅向你展示如果向你的窗口中加入一个基本的菜单,通常你会用到一个提前制作好的菜单资源,这会是一份.rc文件并且会被编译链接进你的.exe可执行程序中.这是具体的流程做法 ...
- 母函数(Generating function)详解
母函数(Generating function)详解 在数学中,某个序列的母函数(Generating function,又称生成函数)是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息.使用 ...
- 《Spring in action》之高级装配
1.Spring 通过配置profile bean.激活profile来设置对应环境. 配置profile bean: 可通过@Profile("dev")注解进行配置.也可以通过 ...
- Codeforces 314B(倍增)
题意:[a,b]表示将字符串a循环写b遍,[c,d]表示把字符串c循环写d遍,给定a,b,c,d,求一个最大的p,使得[[c,d],p]是[a,b]的子序列(注意不是子串,也就是不要求连续).(b,d ...
- 24、Java并发性和多线程-信号量
以下内容转自http://ifeve.com/semaphore/: Semaphore(信号量) 是一个线程同步结构,用于在线程间传递信号,以避免出现信号丢失(译者注:下文会具体介绍),或者像锁一样 ...
- sql server internal book
Frequently Bought Together + + Total price: $131.71 Add all three to CartAdd all three to List Buy t ...
- Shell细小问题汇总
Shell细小问题汇总 本文原文出处: http://blog.csdn.net/bluishglc/article/details/44276607 严禁不论什么形式的转载,否则将托付CSDN官方维 ...