【后缀数组】poj2406 Power Strings
连续重复子串(pku2406)
给定一个字符串 L,已知这个字符串是由某个字符串 S 重复 R 次而得到的,
求 R 的最大值。
算法分析:
做法比较简单,穷举字符串 S 的长度 k,然后判断是否满足。判断的时候,
先看字符串 L 的长度能否被 k 整除,再看 suffix(1)和 suffix(k+1)的最长公共
前缀是否等于 n-k。在询问最长公共前缀的时候, suffix(1)是固定的,所以 RMQ
问题没有必要做所有的预处理,只需求出 height 数组中的每一个数到
height[rank[1]]之间的最小值即可。整个做法的时间复杂度为 O(n)。
卡倍增……
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 1000001
char s[N];
int n,tong[N],t[N],t2[N],sa[N],rank[N],lcp[N];
bool cmp(int y[],int i,int k)
{
return ((y[sa[i-1]]==y[sa[i]])&&((sa[i-1]+k>=n?-1:y[sa[i-1]+k])==(sa[i]+k>=n?-1:y[sa[i]+k])));
}
void build_sa(int range)
{
int *x=t,*y=t2;
memset(tong,0,sizeof(int)*range);
for(int i=0;i<n;++i) tong[x[i]=s[i]]++;
for(int i=1;i<range;++i) tong[i]+=tong[i-1];
for(int i=n-1;i>=0;--i) sa[--tong[x[i]]]=i;
for(int k=1;k<=n;k<<=1)
{
int p=0;
for(int i=n-k;i<n;++i) y[p++]=i;
for(int i=0;i<n;++i) if(sa[i]>=k) y[p++]=sa[i]-k;
memset(tong,0,sizeof(int)*range);
for(int i=0;i<n;++i) tong[x[y[i]]]++;
for(int i=1;i<range;++i) tong[i]+=tong[i-1];
for(int i=n-1;i>=0;--i) sa[--tong[x[y[i]]]]=y[i];
swap(x,y); p=1; x[sa[0]]=0;
for(int i=1;i<n;++i) x[sa[i]]=cmp(y,i,k)?p-1:p++;
if(p>=n) break;
range=p;
}
}
void get_lcp()
{
int k=0;
for(int i=0;i<n;++i) rank[sa[i]]=i;
for(int i=0;i<n;++i) if(rank[i])
{
if(k) --k;
int j=sa[rank[i]-1];
while(s[i+k]==s[j+k]) ++k;
lcp[rank[i]]=k;
}
}
int query[N];
int main()
{
while(1)
{
scanf("%s",s);
if(s[0]=='.') break;
n=strlen(s);
build_sa(128);
get_lcp();
int minv=n-sa[rank[0]];
for(int i=rank[0];i>=0;--i)
{
query[i]=minv;
minv=min(minv,lcp[i]);
}
minv=lcp[rank[0]+1];
for(int i=rank[0]+1;i<n;++i)
{
query[i]=minv;
minv=min(minv,lcp[i+1]);
}
query[rank[n]]=0;
for(int i=1;i<=n;++i)
if(n%i==0&&query[rank[i]]==n-i)
{
printf("%d\n",n/i);
break;
}
}
return 0;
}
【后缀数组】poj2406 Power Strings的更多相关文章
- POJ2406 Power Strings —— KMP or 后缀数组 最小循环节
题目链接:https://vjudge.net/problem/POJ-2406 Power Strings Time Limit: 3000MS Memory Limit: 65536K Tot ...
- poj2406 Power Strings(kmp)
poj2406 Power Strings(kmp) 给出一个字符串,问这个字符串是一个字符串重复几次.要求最大化重复次数. 若当前字符串为S,用kmp匹配'\0'+S和S即可. #include & ...
- POJ2406 Power Strings(KMP,后缀数组)
这题可以用后缀数组,KMP方法做 后缀数组做法开始想不出来,看的题解,方法是枚举串长len的约数k,看lcp(suffix(0), suffix(k))的长度是否为n- k ,若为真则len / k即 ...
- POJ2406 Power Strings 【KMP 或 后缀数组】
电源串 时间限制: 3000MS 内存限制: 65536K 提交总数: 53037 接受: 22108 描述 给定两个字符串a和b,我们定义a * b是它们的连接.例如,如果a =" ...
- poj2406 Power Strings (kmp 求最小循环字串)
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 47748 Accepted: 19902 ...
- poj2406 Power Strings(kmp失配函数)
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 39291 Accepted: 16315 Descr ...
- 【kmp算法】poj2406 Power Strings
如果next[n]<n/2,一定无解. 否则,必须要满足n mod (n-next[n]) = 0 才行,此时,由于next数组的性质,0~n-next[n]-1的部分一定是最小循环节. [ab ...
- KMP——POJ-3461 Oulipo && POJ-2752 Seek the Name, Seek the Fame && POJ-2406 Power Strings && POJ—1961 Period
首先先讲一下KMP算法作用: KMP就是来求在给出的一串字符(我们把它放在str字符数组里面)中求另外一个比str数组短的字符数组(我们叫它为ptr)在str中的出现位置或者是次数 这个出现的次数是可 ...
- poj2406 Power Strings 【KMP】
Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc&quo ...
随机推荐
- 如何用JavaScript做一个可拖动的div层
可拖动的层在Web设计中用处很多,比如在某些需要自定义风格布局的应用中,控件就需要拖动操作,下面介绍一个,希望可以满足你的需求,顺便学习一下可拖动的层是如何实现的. 下面是效果演示: 这个DIV可以移 ...
- MySQL使用笔记(七)排序和限制数据记录查询
By francis_hao Dec 17,2016 排序数据记录查询 排序是指将筛选出符合条件的数据进行有序排放,有升序(ASC(默认))方式和降序(DESC)方式. mysql> se ...
- HDU4370:0 or 1(最短路)
0 or 1 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4370 Description: Given a n*n matrix Cij (1< ...
- Jquery Ajax异步上传
<script> $(function(){ $('#filephoto').change(function(imgFile){ console.log(imgFile) var file ...
- [POJ1082&POJ2348&POJ1067&POJ2505&POJ1960]简单博弈题总结
鉴于时间紧张...虽然知道博弈是个大课题但是花一个上午时间已经极限了... 希望省选过后再回过头来好好总结一遍吧. 接下来为了看着顺眼一点...还是按照难度顺序吧 POJ1082 一道最简单的博弈 ...
- bzoj 1901 线段树套平衡树+二分答案查询
我们就建一颗线段树,线段树的每一个节点都是一颗平衡树,对于每个询问来说,我们就二分答案, 查询每个二分到的mid在这个区间里的rank,然后就行了 /************************* ...
- bzoj 1601 最小生成树
原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1601 最小生成树的比较水的题,我们只需要加一个源点,连向所有的点,边权为每个点建水库的代价 ...
- 利用opencv自带源码,调试摄像头做人脸检测
本文为原创作品,转载请注明出处 欢迎关注我的博客:http://blog.csdn.net/hit2015spring 和 http://www.cnblogs.com/xujianqing/ 作者: ...
- swt MouseAdapter
Exception in thread "main" java.lang.Error: Unresolved compilation problem: The method ...
- HDU2389(二分图匹配Hopcroft-Carp算法)
Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K (Java/Ot ...