hdu6223(后缀数组)
题意:
给一个长度为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(后缀数组)的更多相关文章
- 后缀数组的倍增算法(Prefix Doubling)
后缀数组的倍增算法(Prefix Doubling) 文本内容除特殊注明外,均在知识共享署名-非商业性使用-相同方式共享 3.0协议下提供,附加条款亦可能应用. 最近在自学习BWT算法(Burrows ...
- BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]
4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...
- BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1383 Solved: 582[Submit][St ...
- POJ3693 Maximum repetition substring [后缀数组 ST表]
Maximum repetition substring Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9458 Acc ...
- POJ1743 Musical Theme [后缀数组]
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 27539 Accepted: 9290 De ...
- 后缀数组(suffix array)详解
写在前面 在字符串处理当中,后缀树和后缀数组都是非常有力的工具. 其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料. 其实后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现, ...
- 【UOJ #35】后缀排序 后缀数组模板
http://uoj.ac/problem/35 以前做后缀数组的题直接粘模板...现在重新写一下模板 注意用来基数排序的数组一定要开到N. #include<cstdio> #inclu ...
- 【BZOJ-2119】股市的预测 后缀数组
2119: 股市的预测 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 334 Solved: 154[Submit][Status][Discuss ...
- 【BZOJ-4698】Sandy的卡片 后缀数组
4698: Sdoi2008 Sandy的卡片 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 140 Solved: 55[Submit][Stat ...
随机推荐
- CodeForces - 948C Producing Snow(优先队列)
题意: n天. 每天你会堆一堆雪,体积为 v[i].每天都有一个温度 t[i] 所有之前堆过的雪在第 i 天体积都会减少 t[i] . 输出每天融化了的雪的体积. 这个题的正解我怎么想都很难理解,但是 ...
- 【LVS】简介与说明
一.IPVS的三种负载均衡技术 通过NAT实现虚拟服务器(VS/NAT) 客户通过Virtual IP Address(虚拟服务的IP地址)访问网络服务时,请求报文到达调度器,调度器根据连接调度算法从 ...
- 精通CSS高级Web标准解决方案(2-1 可视化格式模型之框模型)
浮动.定位.框模型这些控制在页面上安排和显示元素的方式,形成CSS布局. 盒子模型 页面上的每个元素都被看成一个矩形框. 盒子模型有两种,分别是 IE 盒子模型和标准 W3C 盒子模型.他们对盒子模型 ...
- 使用PYTHON创建XML文档_python
当用GOOGLE查的时候,内容几乎都是一样的.但是你想要的东西,一个也没有.例如,我就找不到中国人写的如何使用PYTHON来创建一个XML文件.当然,直接用文件写的方式也能够达到同样的效果,但是毕竟容 ...
- 学习 WebService 第二步:知识准备——SOAP vs REST(wsdl和wadl区别)(转)
原文地址:蓝精灵——默默争上游 笔记: SOAP和REST是两种实现WebService的主要方案(Web API部署REST貌似占了大半壁江山) REST Web Services 基于 HTTP ...
- [CF888G] Xor-mst (Trie 树,最小生成树)
题目链接 Solution \(Trie\) 树 + 启发式合并. 考虑到是异或,于是按位贪心.让高位的尽量相同. 然后要计算每棵子树的代价,似乎并没有很好的方法?? 于是只能启发式合并. 对于每一个 ...
- Java面试题之final、finally和finalize的区别
final: final是一个修饰符,可以修饰变量.方法和类,如果final修饰变量,意味着变量的值在初始化后不能被改变: 防止编译器把final域重排序到构造函数外:(面试的时候估计答出这个估计会加 ...
- 最短Hamilton路径-状压dp解法
最短Hamilton路径 时间限制: 2 Sec 内存限制: 128 MB 题目描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamil ...
- bzoj 1857 三分套三分
题目大意 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxh ...
- zoj 3791 An Easy Game dp
An Easy Game Time Limit: 2 Seconds Memory Limit: 65536 KB One day, Edward and Flandre play a ga ...