HDU - 6223 Infinite Fraction Path (倍增+后缀数组)
题意:给定一个长度为n(n<=150000)的字符串,每个下标i与(i*i+1)%n连边,求从任意下标出发走n步能走出的字典序最大的字符串。
把下标看成结点,由于每个结点有唯一的后继,因此形成的是内向基环树森林,相当于求基环树上字典序最大的路径。
实际上基环树和树一样是可以通过倍增得到走2^k步能走到的结点的,然后后缀数组又可以通过倍增求出长度为2^k的后缀的字典序,两者结合一下就可以对所有路径按字典序排序了。
复杂度$O(nlogn)$,感觉这应该是标解吧,不过由于数据可能比较随机因此直接BFS也能过。。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=+,mod=;
int c[N],sa[N],buf1[N],buf2[N],buf3[N],n,ka,nxt[N][];
char buf[N];
int s[N];
void Sort(int* x,int* y,int m) {
for(int i=; i<m; ++i)c[i]=;
for(int i=; i<n; ++i)++c[x[i]];
for(int i=; i<m; ++i)c[i]+=c[i-];
for(int i=n-; i>=; --i)sa[--c[x[y[i]]]]=y[i];
}
void da(int* s,int n,int m=) {
int *x=buf1,*y=buf2,*z=buf3;
x[n]=y[n]=-;
for(int i=; i<n; ++i)x[i]=s[i],y[i]=i;
Sort(x,y,m);
for(int k=,j=; k<n; k<<=,++j) {
int p=;
for(int i=; i<n; ++i)z[i]=x[nxt[i][j]],y[i]=i;
Sort(z,y,m);
for(int i=; i<n; ++i)y[i]=sa[i];
Sort(x,y,m),p=,y[sa[]]=;
for(int i=; i<n; ++i)y[sa[i]]=x[sa[i-]]==x[sa[i]]&&x[nxt[sa[i-]][j]]==x[nxt[sa[i]][j]]?p-:p++;
if(p==n)break;
swap(x,y),m=p;
}
}
int main() {
int T;
for(scanf("%d",&T); T--;) {
printf("Case #%d: ",++ka);
scanf("%d%s",&n,buf);
for(int i=; i<n; ++i)s[i]=buf[i];
for(int i=; i<n; ++i)nxt[i][]=((ll)i*i+)%n;
for(int k=; k<; ++k)
for(int i=; i<n; ++i)
nxt[i][k]=nxt[nxt[i][k-]][k-];
da(s,n);
for(int i=,u=sa[n-]; i<n; ++i,u=nxt[u][])printf("%c",s[u]);
puts("");
}
return ;
}
HDU - 6223 Infinite Fraction Path (倍增+后缀数组)的更多相关文章
- 【HDOJ6223】Infinite Fraction Path(后缀数组,倍增)
题意: 给一个长度为n的字符串s[0..n-1],但i的后继不再是i+1,而是(i*i+1)%n,求所有长度为n的“子串”中,字典序最大的是谁 n<=150000,s[i]=0..9 思路:后缀 ...
- hdu 6223 Infinite Fraction Path
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6223 题意:给定长度为n的一串数字S,现在要按照一种规则寻找长度为n的数字串,使得该数字串的字典序最大 ...
- hdu6223 Infinite Fraction Path 2017沈阳区域赛G题 bfs加剪枝(好题)
题目传送门 题目大意:给出n座城市,每个城市都有一个0到9的val,城市的编号是从0到n-1,从i位置出发,只能走到(i*i+1)%n这个位置,从任意起点开始,每走一步都会得到一个数字,走n-1步,会 ...
- 2017 ACM/ICPC 沈阳 G题 Infinite Fraction Path
The ant Welly now dedicates himself to urban infrastructure. He came to the kingdom of numbers and s ...
- HDU6223 Infinite Fraction Path bfs+剪枝
Infinite Fraction Path 这个题第一次看见的时候,题意没搞懂就没做,这第二次也不会呀.. 题意:第i个城市到第(i*i+1)%n个城市,每个城市有个权值,从一个城市出发走N个城市, ...
- 2017沈阳区域赛Infinite Fraction Path(BFS + 剪枝)
Infinite Fraction Path Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java ...
- Infinite Fraction Path HDU 6223 2017沈阳区域赛G题题解
题意:给你一个字符串s,找到满足条件(s[i]的下一个字符是s[(i*i+1)%n])的最大字典序的长度为n的串. 思路:类似后缀数组,每次倍增来对以i开头的字符串排序,复杂度O(nlogn).代码很 ...
- HDU 1403 Longest Common Substring(后缀数组,最长公共子串)
hdu题目 poj题目 参考了 罗穗骞的论文<后缀数组——处理字符串的有力工具> 题意:求两个序列的最长公共子串 思路:后缀数组经典题目之一(模版题) //后缀数组sa:将s的n个后缀从小 ...
- 2017 icpc 沈阳 G - Infinite Fraction Path
题目大意:有n个点, 每个点有一个数字0 - 9, 第 i 个点只能到 第(i * i + 1)个点,问你在哪个点出发走n次构成的数字串最大. 思路:利用求后缀数组的倍增比较思想, 许多细节需要注意. ...
随机推荐
- JQ scrollTop 无效的场景
先要设置DOM为显示,然后在设置scrollTop,先后顺序不能调换.
- phpstorm设置的快捷键突然失效了,提示: IdeaVim ...
下班后,打开PHPstorm,突然感觉不对,经常用的快捷键突然用不了. 例如按了 Ctrl+F 快捷键后,提示: IdeaVim! Using the Ctrl+F shortcut for Vim ...
- python3正则表达式详细用法示例
转载自:https://www.runoob.com/python3/python3-reg-expressions.html
- beautifulsoap爬虫
从html文件读 from bs4 import BeautifulSoup html_doc="文件地址" html_file=open(html_doc,"r&quo ...
- [转帖]LINUX网络配置---nmtui&nmcli
LINUX网络配置---nmtui&nmcli https://blog.51cto.com/13625527/2151853?source=dra 两年前曾经打打印过 几页命令 里面就有 n ...
- spring-boot war包部署(二)
环境 jdk 8 tomcat 8.5 sts 4.4.2 maven 3.6.1 背景 有时候,服务器已经有了,我们必须要使用 war 包进行部署,所以需要 spring boot 支持打包和部署成 ...
- ubuntu上安装及使用docker
关于Docker: Docker 是一个开源项目,为开发者和系统管理员提供了一个开放的平台,在任何地方通过打包和运行应用程序作为一个轻量级的容器.Docker 在软件容器内自动部署应用程序.Docke ...
- es6 getter setter
https://stackoverflow.com/questions/34517538/setting-an-es6-class-getter-to-enumerable 1. 我要 getter ...
- oracle建表详细信息
一张用户表 -- Create table create table OA_DM.DM_GY_USER ( ), username ) not null, loginname ) not null, ...
- vs2017 不能加载.vdproj
需要添加Microsoft Visual Studio Installer Projects扩展 下载地址:https://marketplace.visualstudio.com/items?it ...