题意:

  给一个长度为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 ; }

最新文章

  1. Lua 学习笔记(九)协同程序(线程thread)
  2. Python赋值语句与深拷贝、浅拷贝的区别
  3. opencart 模块开发详解
  4. 【动态页面】(二)Java反射
  5. 解决Chrome无法加载Shockwave Flash
  6. Android 模块化编程之引用本地的aar
  7. SQL Server2008不允许修改表结构解决办法
  8. SpringMVC+Spring+Hibernate的小样例
  9. 怎么破解Wifi密码
  10. 关于druid的配置说明
  11. Windows下Apache的下载安装启动停止
  12. 利用QrCode.Net生成二维码 asp.net mvc c#
  13. Jmeter函数助手
  14. SOFARPC —— SPI 解析
  15. Lodop窗口的按钮、权限,隐藏或设置功能不可用
  16. aic bic mdl
  17. django-mysql表的增删改查
  18. 6.requests编写企查查爬虫
  19. Java垃圾收集调优实战
  20. 【BZOJ】4753: [Jsoi2016]最佳团体 01分数规划+树上背包

热门文章

  1. (转)git常见错误
  2. HDU - 4027 Can you answer these queries?(线段树)
  3. V4L2使用V4L2_MEMORY_USERPTR和V4L2_MEMORY_MMAP的区别
  4. BZOJ 5313: 新Fib数列
  5. SPOJ 375 树链剖分 QTREE - Query on a tree
  6. 转:模式窗口showModalDialog的用法总结
  7. python - unittest - testsuite and runner
  8. day04_02 知识回顾、赋值运算符
  9. hashlib.md5加密
  10. PHP杂技(一)