题意:给你一个字符串s,找到满足条件(s[i]的下一个字符是s[(i*i+1)%n])的最大字典序的长度为n的串。

思路:类似后缀数组,每次倍增来对以i开头的字符串排序,复杂度O(nlogn)。代码很多地方借鉴后缀数组。

倍增:比如这次排序好了长度为m的串,那么想扩展为长度为2*m的串则需要用i的排名为第一关键字,i+m的排名为第二关键字进行排序,这种排序正好可以使用基数排序。

下面是代码:

 #include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=;
int n;
int m;
int tp[maxn],Rank[maxn],SA[maxn],tax[maxn];
void Rsort()///SA为排名为i的元素所在的位置,tp为第二关键字,Rank作为第一关键字,Rank为i元素的排名。
{
for(int i=; i<=m; i++)tax[i]=;
for(int i=; i<=n; i++)tax[Rank[tp[i]]]++;
for(int i=; i<=m; i++)tax[i]+=tax[i-];
for(int i=n; i>=; i--)SA[tax[Rank[tp[i]]]--]=tp[i];
}
char st[maxn];
int go[maxn][];
int main()
{
int t;
while(~scanf("%d",&t))
{
int c=;
while(t--)
{
scanf("%d",&n);
scanf("%s",st+);
for(long long i=; i<=n; i++)
go[i][]=((i-)*(i-)+)%n+;///滚动数组,倍增查找i后面的第2^k的位置。
m=;
for(int i=; i<=n; i++)
tp[i]=i,Rank[i]=st[i]-'';
int p;
for(int t=; t<&&(<<t)<=n; t++)
{
for(int i=;i<=m;i++)tax[i]=;
for(int i=; i<=n; i++)tax[Rank[go[i][t&]]]++;
for(int i=;i<=m;i++)tax[i]+=tax[i-];
for(int i=;i<=n;i++)tp[tax[Rank[go[i][t&]]]--]=i;
Rsort();
swap(tp,Rank);
Rank[SA[]]=p=;
for(int i=; i<=n; i++)Rank[SA[i]]=(tp[SA[i]]==tp[SA[i-]]&&tp[go[SA[i]][t&]]==tp[go[SA[i-]][t&]])?p:++p;
if(Rank[SA[n]]!=Rank[SA[n-]])break;///剪枝,如果已经能确定最大的了 直接break
m=p;
for(int i=;i<=n;i++)
go[i][!(t&)]=go[go[i][t&]][t&];///这里是倍增,go[i]代表i后面第2^t的元素的位置
}
printf("Case #%d: ",c++);
long long loc=SA[n]-;
for(int i=; i<n; i++,loc=(loc*loc+)%n)
printf("%c",st[loc+]);
puts("");
}
}
return ;
}

Infinite Fraction Path HDU 6223 2017沈阳区域赛G题题解的更多相关文章

  1. hdu6223 Infinite Fraction Path 2017沈阳区域赛G题 bfs加剪枝(好题)

    题目传送门 题目大意:给出n座城市,每个城市都有一个0到9的val,城市的编号是从0到n-1,从i位置出发,只能走到(i*i+1)%n这个位置,从任意起点开始,每走一步都会得到一个数字,走n-1步,会 ...

  2. ACM-ICPC 2017 沈阳赛区现场赛 G. Infinite Fraction Path && HDU 6223(BFS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6223 参考题解:https://blog.csdn.net/qq_40482495/article/d ...

  3. HDU 6229 Wandering Robots(2017 沈阳区域赛 M题,结论)

    题目链接  HDU 6229 题意 在一个$N * N$的格子矩阵里,有一个机器人. 格子按照行和列标号,左上角的坐标为$(0, 0)$,右下角的坐标为$(N - 1, N - 1)$ 有一个机器人, ...

  4. hdu6229 Wandering Robots 2017沈阳区域赛M题 思维加map

    题目传送门 题目大意: 给出一张n*n的图,机器人在一秒钟内任一格子上都可以有五种操作,上下左右或者停顿,(不能出边界,不能碰到障碍物).题目给出k个障碍物,但保证没有障碍物的地方是强联通的,问经过无 ...

  5. HDU 6205 2017沈阳网络赛 思维题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6205 题意:给你n堆牌,原本每一堆的所有牌(a[i]张)默认向下,每次从第一堆开始,将固定个数的牌(b ...

  6. 2017沈阳区域赛Infinite Fraction Path(BFS + 剪枝)

    Infinite Fraction Path Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java ...

  7. HDU 6200 2017沈阳网络赛 树上区间更新,求和

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6200 题意:给个图,有2种操作,一种是加一条无向边,二是查询u,v之间必须有的边的条数,所谓必须有的边 ...

  8. HDU 6199 2017沈阳网络赛 DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6199 题意:n堆石子,Alice和Bob来做游戏,一个人选择取K堆那么另外一个人就必须取k堆或者k+1 ...

  9. HDU 6203 2017沈阳网络赛 LCA,DFS+树状数组

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6203 题意:n+1 个点 n 条边的树(点标号 0 ~ n),有若干个点无法通行,导致 p 组 U V ...

随机推荐

  1. Spring框架系列之AOP思想

    微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.AOP概述 (1).什么是 AOP AOP 为 Aspect Oriented Progra ...

  2. docker数据库

    拉取镜像 # docker pull mysql: 创建docker数据库容器 # docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASS ...

  3. Node.js的下载、安装、配置、Hello World、文档阅读

    Node.js的下载.安装.配置.Hello World.文档阅读

  4. 支持ipV6和ipV4的客户端编程

    ipv4和ipv6在socket初始化的时候是不一样的. ipv4 socket初始化: int CClient::InitSocket(CString strIP, short portNum) { ...

  5. 3.3 for 循环

    Python 编程中 for循环用来遍历序列类型的对象,逐一取出序列中的元素值,每取出一个元素值就执行一次循环体,直到元素取完,循环结束.循环体中的代码块可以和序列中的元素值一点关系都没有,因为for ...

  6. 快了快了,你的 MacBook Pro 和 FineUICore!

    着玻璃窗,看到星巴克里那帮人拿着MacBook喝咖啡,你是不是要默念一遍:这帮傻叉,就爱装逼! 不过话说回来,你想不想尝试下这个傻叉的感觉? 是时候了,给自己一个理由,拥有自己的 MacBook Pr ...

  7. 放大倍数超5万倍的Memcached DDoS反射攻击,怎么破?

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯游戏云 背景:Memcached攻击创造DDoS攻击流量纪录 近日,利用Memcached服务器实施反射DDoS攻击的事件呈大幅上 ...

  8. ORACLE虚拟索引(Virtual Index)

    ORACLE虚拟索引(Virtual Index)   虚拟索引概念 虚拟索引(Virtual Indexes)是一个定义在数据字典中的假索引(fake index),它没有相关的索引段.虚拟索引的目 ...

  9. vxWorks 命令

    1.4.1 任务管理    sp( )            用缺省参数创建一个任务(priority="100" 返回值为任务ID,或错误)(taskSpawn) sps( )  ...

  10. Unable to find the ncurses libraries的解决办法

    我们在更新CentOS或者Ubuntu的内核时,执行make menuconfig可能看如这样的错误: *** Unable to find the ncurses libraries or the* ...