题意:

  给一个长度为n的字符串s[0..n-1],但i的后继不再是i+1,而是(i*i+1)%n,求所有长度为n的“子串”中,字典序最大的是谁

  n<=150000

分析:

  如果是一般的字符串,那么直接求出后缀数组就行,但现在后继关系发生了变化

  我们在倍增求后缀数组的过程中,只关心某个位置的下个2^k的后继,于是可以先倍增预处理出每个位置的nx[i][j]表示位置i的下个2^j的后继是谁

  时间复杂度O(nlogn)

 #include<bits/stdc++.h>
using namespace std;
const int maxn=2e5;
char s[maxn+];
int sa[maxn+],rk[maxn+];
int t[maxn+],t2[maxn+],c[maxn+];
int nx[maxn+][];
int len,k;
queue<int> q[maxn+];
void getsa(int m)//m表示最大字符的编码
{
memset(t,-,sizeof(t));
memset(t2,-,sizeof(t2));
int *x=t,*y=t2;
for(int i=;i<m;++i) c[i]=;
for(int i=;i<len;++i) c[x[i]=s[i]]++;
for(int i=;i<m;++i) c[i]+=c[i-];
for(int i=len-;i>=;--i) sa[--c[x[i]]]=i;
for(int j=,k=;k<=len;k<<=,++j)
{
/*int p=0;
for(int i=len-k;i<len;++i) y[p++]=i;
for(int i=0;i<len;++i) if(sa[i]>=k) y[p++]=sa[i]-k;*/ int p=;
for(int i=;i<len;++i) q[nx[i][j]].push(i);
for(int i=;i<len;++i)
while(!q[sa[i]].empty())
{
y[p++]=q[sa[i]].front();
q[sa[i]].pop();
} for(int i=;i<m;++i) c[i]=;
for(int i=;i<len;++i) c[x[y[i]]]++;
for(int i=;i<m;++i) c[i]+=c[i-];
for(int i=len-;i>=;--i) sa[--c[x[y[i]]]]=y[i];
swap(x,y);
p=,x[sa[]]=;
for(int i=;i<len;++i)
if(y[sa[i-]]==y[sa[i]]&&y[nx[sa[i-]][j]]==y[nx[sa[i]][j]]) x[sa[i]]=p-;else x[sa[i]]=p++;
if(p>=len) break;
m=p;
}
}
int main()
{
int T;
scanf("%d",&T);
for(int cas=;cas<=T;++cas)
{
printf("Case #%d: ",cas);
scanf("%d",&len);
scanf("%s",s);
for(int i=;i<len;++i) nx[i][]=(1LL*i*i+)%len;
for(int j=;j<=;++j)
for(int i=;i<len;++i) nx[i][j]=nx[nx[i][j-]][j-];
getsa(''+);
int pos=sa[len-];
for(int i=;i<=len;++i,pos=nx[pos][]) printf("%c",s[pos]);
printf("\n");
} // for(int i=0;i<n;++i) printf("%d ",sa[i]);printf("\n");
// for(int i=0;i<n;++i) printf("%d ",rk[i]);printf("\n");
// for(int i=0;i<n;++i) printf("%d ",height[i]);printf("\n");
return ; }

hdu6223(后缀数组)的更多相关文章

  1. 后缀数组的倍增算法(Prefix Doubling)

    后缀数组的倍增算法(Prefix Doubling) 文本内容除特殊注明外,均在知识共享署名-非商业性使用-相同方式共享 3.0协议下提供,附加条款亦可能应用. 最近在自学习BWT算法(Burrows ...

  2. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

  3. BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1383  Solved: 582[Submit][St ...

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

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

  5. POJ1743 Musical Theme [后缀数组]

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 27539   Accepted: 9290 De ...

  6. 后缀数组(suffix array)详解

    写在前面 在字符串处理当中,后缀树和后缀数组都是非常有力的工具. 其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料. 其实后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现, ...

  7. 【UOJ #35】后缀排序 后缀数组模板

    http://uoj.ac/problem/35 以前做后缀数组的题直接粘模板...现在重新写一下模板 注意用来基数排序的数组一定要开到N. #include<cstdio> #inclu ...

  8. 【BZOJ-2119】股市的预测 后缀数组

    2119: 股市的预测 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 334  Solved: 154[Submit][Status][Discuss ...

  9. 【BZOJ-4698】Sandy的卡片 后缀数组

    4698: Sdoi2008 Sandy的卡片 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 140  Solved: 55[Submit][Stat ...

随机推荐

  1. OpenCV中图像的BGR格式及Img对象的属性说明

    1. 图像的BGR格式说明 OpenCV中图像读入的数据格式是numpy的ndarray数据格式.是BGR格式,取值范围是[0,255]. 如下图所示,分为三个维度: 第一维度:Height 高度,对 ...

  2. git push后是空目录,且提示modified content, untracked content

    最近往自己的github传代码时,每一步都正常,但最后push上去之后是空目录,且在本地执行git status时提示: 后来发现是由于push的工程下本来就有个.git目录,所以才导致push上去的 ...

  3. C语言高效编程的几招,你会了几招了?

    编写高效简洁的C 语言代码,是许多软件工程师追求的目标.本文就工作中的一些体会和经验做相关的阐述,不对的地方请各位指教. 第1 招:以空间换时间 计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个 ...

  4. <node>……express的中间件……//

    Express是一个基于Node.js平台的web应用开发框架,在Node.js基础之上扩展了web应用开发所需要的基础功能,从而使得我们开发Web应用更加方便.更加快捷. 中间件是什么? 中间件函数 ...

  5. HDU 3394 双连通分量 桥 Railway

    第一个答案是统计图中桥的个数 如果一个点-双连通分量中边的个数大于点的个数那么这个块中所有的边都是冲突的,累加到第二个答案中去. #include <iostream> #include ...

  6. Freemaker模板指令

    ${...}:Freemaker将会输出真实的值来替换大括号内的表达式.这样的表达式被称为interpolation(插值). FTL标签(Freemaker模板的语言标签):FTL标签和HTML标签 ...

  7. 求1+2+...+n 【微软面试100题 第十二题】

    题目要求: 要求不能使用乘除法,for/while/if/else/switch/case等关键字以及条件判断语句(A?B:C). 参考资料:剑指offer第46题 题目分析: 方法1:利用类的静态成 ...

  8. 0014.Linux环境搭建 Python环境搭建

    -安装Linux-- 找了了老男孩19期的运维班安装视频,尼玛真心不想看书,文字枯燥的要死,还不如直接看视频进行安装... 可怜了我的C盘只有1GB了...绝对不能安装在C盘...那就安装在E盘吧,足 ...

  9. Django--------问题:在terminal命令行创建超级用户时入到password时输入为什么没有反应?

    首先如果遇到这样的问题不用担心,一般一会儿就可以解决: 其实,输入的时候并不是没有反应,只是你输入的时候命令行没有将你的输入显示出来,关键是输入行对Password:********也不是采用这种方式 ...

  10. 理解Tomcat架构、启动流程及其性能优化

    PS:but, it's bullshit ! 备注:实话说,从文档上扒拉的,文档地址:在每一个Tomcat安装目录下,会有一个webapps文件夹,里面有一个docs文件夹,点击index.html ...