传送门

后缀数组好题。


考虑枚举循环节长度lenlenlen。

然后考虑枚举循环节的起点来更新答案。

但是直接枚举每次O(n)O(n)O(n)。

考虑枚举len∗k+1len*k+1len∗k+1作为起点。

然后用len∗(k−1)+1len*(k-1)+1len∗(k−1)+1和len∗k+1len*k+1len∗k+1之间的某一段有可能使循环节长度再加一。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#define ri register int
using namespace std;
const int N=1e5+5;
char s[N];
int sa2[N],cnt[N],n,Log[N],m,sa[N],rk[N],ht[N],st[N][17],pos[N],top=0;
inline void Sort(){
	for(ri i=1;i<=m;++i)cnt[i]=0;
	for(ri i=1;i<=n;++i)++cnt[rk[i]];
	for(ri i=2;i<=m;++i)cnt[i]+=cnt[i-1];
	for(ri i=n;i;--i)sa[cnt[rk[sa2[i]]]--]=sa2[i];
}
inline void getsa(){
	for(ri i=1;i<=n;++i)rk[i]=s[i]-'a'+1,sa2[i]=i;
	m=130,Sort();
	for(ri w=1,p=0;m!=n;p=0,w<<=1){
		for(ri i=n-w+1;i<=n;++i)sa2[++p]=i;
		for(ri i=1;i<=n;++i)if(sa[i]>w)sa2[++p]=sa[i]-w;
		Sort(),swap(rk,sa2),rk[sa[1]]=p=1;
		for(ri i=2;i<=n;++i)rk[sa[i]]=(sa2[sa[i]]==sa2[sa[i-1]]&&sa2[sa[i]+w]==sa2[sa[i-1]+w])?p:++p;
		m=p;
	}
	for(ri i=1,j,k=0;i<=n;ht[rk[i++]]=k)for(k?--k:k,j=sa[rk[i]-1];s[i+k]==s[j+k];++k);
	for(ri i=1;i<=n;++i)st[i][0]=ht[i];
	for(ri j=1;j<=16;++j)for(ri i=1;i+(1<<j)<=n;++i)st[i][j]=min(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}
inline int rmq(int l,int r){return min(st[l][Log[r-l+1]],st[r+1-(1<<Log[r-l+1])][Log[r-l+1]]);}
inline int Query(int l,int r){return rmq(min(rk[l],rk[r])+1,max(rk[l],rk[r]));}
inline void query(){
	int tim=1,ans=1,len=0;
	for(ri T=1;T<n;++T){
		for(ri l=1,r=T+1;r<=n;l+=T,r+=T){
			int L=Query(l,r),stp=L/T+1,pl=l-(T-L%T),pr=pl+T;
			if(pl>0&&L%T)if(Query(pl,pr)>=L)++stp;
			if(stp>tim)tim=stp,pos[top=1]=T;
			else if(stp==tim)pos[++top]=T;
		}
	}
	for(ri i=1;!len&&i<=n;++i)for(ri j=1,T=pos[j];j<=top;T=pos[++j])if(Query(sa[i],sa[i]+T)>=(tim-1)*T){ans=sa[i],len=T;break;}
	for(ri i=ans,j=1;j<=len*tim;++j,++i)printf("%c",s[i]);
}
int main(){
	for(ri i=2;i<=100000;++i)Log[i]=Log[i>>1]+1;
	for(ri tt=1;;++tt,puts(""),top=0){
		scanf("%s",s+1),n=strlen(s+1);
		if(s[1]=='#')break;
		printf("Case %d: ",tt),getsa(),query();
	}
	return 0;
}

2018.11.24 poj3693Maximum repetition substring(后缀数组)的更多相关文章

  1. 2018.11.24 poj3261Milk Patterns(后缀数组)

    传送门 后缀数组经典题. 貌似可以用二分答案+后缀数组? 我自己yyyyyy了一个好写一点的方法. 直接先预处理出heightheightheight数组. 然后对于所有连续的k−1k-1k−1个he ...

  2. POJ-3693-Maximum repetition substring(后缀数组-重复次数最多的连续重复子串)

    题意: 给出一个串,求重复次数最多的连续重复子串 分析: 比较容易理解的部分就是枚举长度为L,然后看长度为L的字符串最多连续出现几次. 既然长度为L的串重复出现,那么str[0],str[l],str ...

  3. 2018.11.24 poj3415Common Substrings(后缀数组+单调栈)

    传送门 常数实在压不下来(蒟蒻开O(3)都过不了). 但有正确性233. 首先肯定得把两个字符串接在一起. 相当于heightheightheight数组被height<kheight<k ...

  4. POJ3693 Maximum repetition substring [后缀数组 ST表]

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9458   Acc ...

  5. POJ3693 Maximum repetition substring 后缀数组

    POJ - 3693 Maximum repetition substring 题意 输入一个串,求重复次数最多的连续重复字串,如果有次数相同的,则输出字典序最小的 Sample input ccab ...

  6. Maximum repetition substring 后缀数组

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7578   Acc ...

  7. POJ3693 Maximum repetition substring —— 后缀数组 重复次数最多的连续重复子串

    题目链接:https://vjudge.net/problem/POJ-3693 Maximum repetition substring Time Limit: 1000MS   Memory Li ...

  8. POJ 3693 Maximum repetition substring ——后缀数组

    重复次数最多的字串,我们可以枚举循环节的长度. 然后正反两次LCP,然后发现如果长度%L有剩余的情况时,答案是在一个区间内的. 所以需要找到区间内最小的rk值. 两个后缀数组,四个ST表,$\Thet ...

  9. poj3693 Maximum repetition substring (后缀数组+rmq)

    Description The repetition number of a string is defined as the maximum number R such that the strin ...

随机推荐

  1. 188. Best Time to Buy and Sell Stock IV (Array; DP)

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  2. Netty实践一(数据通信)

    我们需要了解下在真正项目应用中如何去考虑Netty的使用,大体上对于一些参数设置都是根据服务器性能决定的.这个不是最主要的. 我们需要考虑的问题是两台机器(甚至多台)使用Netty的怎样进行通信,大体 ...

  3. [剑指Offer]34-二叉树中和为某一值的路径

    题目链接 https://www.nowcoder.com/practice/b736e784e3e34731af99065031301bca?tpId=13&tqId=11177&t ...

  4. [codeforces_597B] Restaurant(贪心)

    题目链接 http://codeforces.com/problemset/problem/597/B 题意 输入:区间数目n.及n个区间的起止(左闭右闭). 输出:最多不重叠的区间有多少个. 思路 ...

  5. Python词云(词频统计,掩膜显示)

    Python2.7 anaconda.安装Wordcloud,网上有许多下载路径,说一下掩模,就是在这个膜的区域才会有东西,当然这个与实际的掩模还有一定区别,这个词频显示是把所有统计的词,显示在这个掩 ...

  6. 浅谈Java代理二:Cglib动态代理-MethodInterceptor

    浅谈Java代理二:Cglib动态代理-MethodInterceptor CGLib动态代理特点: 使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生 ...

  7. 使用Nginx做转发和匹配替换

    Nginx是一个强大的服务器软件,由于处理数据内容处于第七层协议应用层的原因,所以获取的数据也比较完整: Nginx做转发: 这个很简单,vi nginx.conf(编辑nginx配置文件) 添加lo ...

  8. TLS1.1升级到TLS1.2(微信小程序要求TLS1.2以上)

    检测是否具有TLS1.2:www.ssllabs.com 实验过的办法: https://www.cnblogs.com/wqcheng/p/6618070.html http://www.ocbc. ...

  9. java8 数据结构的改变(二) 对ConcurrentHashMap影响

    https://www.cnblogs.com/study-everyday/p/6430462.html http://www.importnew.com/22007.html

  10. Linux下查看系统启动 、运行以及安装时间

    1.uptime命令  例子显示已启动13天 当前用户一个 [root@localhost-live version-build-related]# uptime :: up days, :, use ...