题意:

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

n<=150000,s[i]=0..9

思路:后缀数组

因为前驱与后继的关系已经变化,就不能用下标直接加减

i的后继是唯一的,i的前驱却不一定

所以对于后继使用倍增,对于前驱每个位置暴力开队列存储,需要的时候再拿出来

在判断的地方稍作修改

 #include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define fi first
#define se second
#define MP make_pair
#define N 310000
#define MOD 1000000007
#define eps 1e-8
#define pi acos(-1)
queue<int> q[N]; char ch[N];
int n,s[N],sa[N],wa[N],wb[N],wc[N],wd[N],height[N],Rank[N],
f[N][]; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} bool cmp(int *r,int a,int b,int l)
{
return r[a]==r[b]&&r[f[a][l]]==r[f[b][l]];
// return r[a]==r[b]&&r[a+l]==r[b+l]; 原来的写法
} void getsa(int *r,int *sa,int n,int m)
{
// printf("\n");
int *x=wa,*y=wb,p;
int k=;
for(int i=;i<n;i++) wc[x[i]=r[i]]++;
for(int i=;i<m;i++) wc[i]+=wc[i-];
for(int i=n-;i>=;i--) sa[--wc[x[i]]]=i;
for(int j=,p=;p<n;j*=,m=p)
{
p=;
/*for(i=n-j;i<n;i++) y[p++]=i;
for(i=0;i<n;i++)
if(sa[i]>=j) y[p++]=sa[i]-j;
*/ //默认后继为i+1应该是这个写法 for(int i=;i<n;i++) q[f[i][k]].push(i);
for(int i=;i<n;i++)
while(!q[sa[i]].empty())
{
y[p++]=q[sa[i]].front();
q[sa[i]].pop();
}
for(int i=;i<n;i++) wd[i]=x[y[i]];
for(int i=;i<m;i++) wc[i]=;
for(int i=;i<n;i++) wc[wd[i]]++;
for(int i=;i<m;i++) wc[i]+=wc[i-];
for(int i=n-;i>=;i--) sa[--wc[wd[i]]]=y[i];
swap(x,y);
p=; x[sa[]]=;
for(int i=;i<n;i++)
x[sa[i]]=cmp(y,sa[i-],sa[i],k)?p-:p++;
//printf("%d %d %d\n",k,j,p);
k++;
if(j>n) break; //加上这句就A了,应该都是N很大,D[i]相同的数据吧,名次的并列很多
}
} int main()
{
freopen("hdoj6223.in","r",stdin);
freopen("hdoj6223.out","w",stdout);
int cas;
scanf("%d",&cas);
for(int v=;v<=cas;v++)
{
printf("Case #%d: ",v);
scanf("%d",&n);
scanf("%s",ch);
for(int i=;i<n;i++) s[i]=ch[i]-''+;
for(int i=;i<n;i++) f[i][]=(1LL*i*i+)%n; for(int j=;j<=;j++)
for(int i=;i<n;i++) f[i][j]=f[f[i][j-]][j-]; s[n]=;
getsa(s,sa,n+,);
int k=sa[n];
for(int i=;i<=n;i++)
{
printf("%c",ch[k]);
k=f[k][];
}
printf("\n");
for(int i=;i<=max(,n);i++)
{
s[i]=sa[i]=wa[i]=wb[i]=wc[i]=wd[i]=
Rank[i]=;
}
}
return ;
}

【HDOJ6223】Infinite Fraction Path(后缀数组,倍增)的更多相关文章

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

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

  2. 【bzoj5073】[Lydsy1710月赛]小A的咒语 后缀数组+倍增RMQ+贪心+dp

    题目描述 给出 $A$ 串和 $B$ 串,从 $A$ 串中选出至多 $x$ 个互不重合的段,使得它们按照原顺序拼接后能够得到 $B$ 串.求是否可行.多组数据. $T\le 10$ ,$|A|,|B| ...

  3. 【bzoj3879】SvT 后缀数组+倍增RMQ+单调栈

    题目描述 (我并不想告诉你题目名字是什么鬼) 有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个询问,我们给出若干个后缀(以其在S中出现的起始位置来表示), ...

  4. 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 ...

  5. HDU6223 Infinite Fraction Path bfs+剪枝

    Infinite Fraction Path 这个题第一次看见的时候,题意没搞懂就没做,这第二次也不会呀.. 题意:第i个城市到第(i*i+1)%n个城市,每个城市有个权值,从一个城市出发走N个城市, ...

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

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

  7. HDU - 6223 Infinite Fraction Path (倍增+后缀数组)

    题意:给定一个长度为n(n<=150000)的字符串,每个下标i与(i*i+1)%n连边,求从任意下标出发走n步能走出的字典序最大的字符串. 把下标看成结点,由于每个结点有唯一的后继,因此形成的 ...

  8. Infinite Fraction Path HDU 6223 2017沈阳区域赛G题题解

    题意:给你一个字符串s,找到满足条件(s[i]的下一个字符是s[(i*i+1)%n])的最大字典序的长度为n的串. 思路:类似后缀数组,每次倍增来对以i开头的字符串排序,复杂度O(nlogn).代码很 ...

  9. 2017 icpc 沈阳 G - Infinite Fraction Path

    题目大意:有n个点, 每个点有一个数字0 - 9, 第 i 个点只能到 第(i * i + 1)个点,问你在哪个点出发走n次构成的数字串最大. 思路:利用求后缀数组的倍增比较思想, 许多细节需要注意. ...

随机推荐

  1. Could not resolve matching constructor (hint: specify index/type/name arguments for simple parameter 标签: 构造器注入Spring

    问题:要么是因为构造方法改变了,要么就是构造方法入参实例化失败(比如没有实现) 问题 在练习spring构造器注入方式的小程序的时候报错: Exception in thread “main” org ...

  2. CPP-网络/通信:POST

    BOOL PostSubmit(CString strUrl,const CString&strPara, CString&strContent){ BOOL bRet=FALSE; ...

  3. Codeforces Round #272 (Div. 2)-B. Dreamoon and WiFi

    http://codeforces.com/contest/476/problem/B B. Dreamoon and WiFi time limit per test 1 second memory ...

  4. Python IDE推荐

    八个最佳Python IDE 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs Python是一种功能强大.语言简洁的编程语言.本文向大家推荐8个适合pyt ...

  5. bootstrap历练实例:复选框或单选按钮作为输入框组的前缀或后缀

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  6. Greenplum介绍-table

    GP中的table和其它关系型数据表是一样的,除了数据被分布在不同的segment以外. 建表时需定义以下几个方面:1. 指定列和数据类型2. 约束3. 分布策略4. 数据存储方式5. 大表分区策略 ...

  7. Spring容器的理解

    控制反转(IOC,Inversion Of Contorl)和依赖注入(DI,Dependency Injection) IOC是一个宽泛的概念:对某事物的控制权由A转移到B. DI是实现IOC的一种 ...

  8. **没有规则可以创建“XXX”需要的目标“XXX”问题的解决方案

    一.现象 我将之前Redhat9.0编译好的uboot,转到ubuntu12.04环境.在ubuntu环境下对 uboot重新编译提示错误.编译过程如下: root@hailin-virtual-ma ...

  9. python_列表——元组——字典——集合

    列表——元组——字典——集合: 列表: # 一:基本使用# 1.用途:存放多个值 # 定义方式:[]内以逗号为分隔多个元素,列表内元素无类型限制# l=['a','b','c'] #l=list([' ...

  10. Knockout v3.4.0 中文版教程-1-入门和安装

    英文原版教程:http://knockoutjs.com/documentation/introduction.html 注:此教程根据英文原版翻译,仅作练习,如有不足或错误,请指正 说明: 对原文中 ...