Hdu 5442 Favorite Donut (2015 ACM/ICPC Asia Regional Changchun Online 最大最小表示法 + KMP)
题目链接:
题目描述:
给出一个文本串,找出顺时针或者逆时针循环旋转后,字典序最大的那个字符串,字典序最大的字符串如果有多个,就输出下标最小的那个,如果顺时针和逆时针的起始下标相同,则输出顺时针。
解题思路:
看到题目感觉后缀数组可以搞,正准备犯傻被队友拦下了,听队友解释一番,果断丢锅给队友。赛后试了一下后缀数组果然麻烦的不要不要的(QWQ),还是最大最小表示法 + KMP来的干净利索。
最大表示法:对于一个长度为len文本串,经过循环旋转得到长度为len的新串,新串是所有循环旋转得到的串中字典序最大的。
实现方法:对于文本串s,我们可以设定两个指针i, j.
刚开始的时候i = 0, j = 1;
当s[i] == s[j]时, (设定指针k) 从i, j 开始比较,直到s[i+k]!= s[j+k];
如果s[i+k] < s[j+k], i += k + 1, k = 0;
因为s[i+k] < s[j+k],证明以i开头的串已经没有意义,以i开头的串一定小于以j开头的串的字典序,所以把指针i移动到(i+k+1)的位置继续和以j开头的串比较;
依此得, j += k + 1, k = 0, 当前j 为最大表示串的起始点;
最后返回min(i, j)即可。(最小表示法把上面的大于改成小于就ok!)
代码实现:
int Max_Repre (char s[], int n)
{
int i = , j = , k = ;
while (i<n && j<n && k<n)
{
int nu = s[(i+k)%n] - s[(j+k)%n]; if ( !nu ) k++;
else
{
if (nu < )
i += k + ;
else
j += k + ; if (i == j)
j ++;
k = ; }
}
return min (i, j);
}
下面是Hdu 5442 代码,还是要比sa好很多的 (惬意!!!!)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int maxn = ;
int Next[maxn]; int Max_Repre (char s[], int n)
{
int i = , j = , k = ;
while (i<n && j<n && k<n)
{
int nu = s[(i+k)%n] - s[(j+k)%n]; if ( !nu ) k++;
else
{
if (nu < )
i += k + ;
else
j += k + ; if (i == j)
j ++;
k = ; }
}
return min (i, j);
} int Get_Next (char s[], int n)
{
int k = -, i = ;
Next[] = -; while (i < n)
{
if (k == - || s[k]==s[i])
Next[++i] = ++k; else
k = Next[k];
} if (n % (n - Next[n]))
return n;
return n - Next[n];
} void display (char a[], char s[], int x, int n)
{
for (int i=; i<n; i++)
a[i] = s[(x+i)%n]; a[n] = ;
} //a大,return true,b大 return false
bool Judge (int a, int b, char A[], char B[])
{
int k = strcmp (A, B); if (k == )
return a<=b ? true:false;
return k>?true:false;
} int main ()
{
int t, n, k, a, b;
char S[maxn], A[maxn], B[maxn];
scanf ("%d", &t); while (t --)
{
scanf ("%d %s", &n, S); k = Get_Next (S, n);
a = Max_Repre (S, n);
display (A, S, a, n); strrev (S);
b = Max_Repre (S, n);
display (B, S, b, n);
b = (n - b - ) % k; if (Judge (a, b, A, B))
printf ("%d 0\n", a + );
else
printf ("%d 1\n", b + );
}
return ;
}
Hdu 5442 Favorite Donut (2015 ACM/ICPC Asia Regional Changchun Online 最大最小表示法 + KMP)的更多相关文章
- Hdu 5446 Unknown Treasure (2015 ACM/ICPC Asia Regional Changchun Online Lucas定理 + 中国剩余定理)
题目链接: Hdu 5446 Unknown Treasure 题目描述: 就是有n个苹果,要选出来m个,问有多少种选法?还有k个素数,p1,p2,p3,...pk,结果对lcm(p1,p2,p3.. ...
- (并查集)Travel -- hdu -- 5441(2015 ACM/ICPC Asia Regional Changchun Online )
http://acm.hdu.edu.cn/showproblem.php?pid=5441 Travel Time Limit: 1500/1000 MS (Java/Others) Memo ...
- (二叉树)Elven Postman -- HDU -- 54444(2015 ACM/ICPC Asia Regional Changchun Online)
http://acm.hdu.edu.cn/showproblem.php?pid=5444 Elven Postman Time Limit: 1500/1000 MS (Java/Others) ...
- 2015 ACM/ICPC Asia Regional Changchun Online HDU 5444 Elven Postman【二叉排序树的建树和遍历查找】
Elven Postman Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- hdu 5444 Elven Postman(二叉树)——2015 ACM/ICPC Asia Regional Changchun Online
Problem Description Elves are very peculiar creatures. As we all know, they can live for a very long ...
- 【二分】【最长上升子序列】HDU 5489 Removed Interval (2015 ACM/ICPC Asia Regional Hefei Online)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5489 题目大意: 一个N(N<=100000)个数的序列,要从中去掉相邻的L个数(去掉整个区间 ...
- 【贪心】【模拟】HDU 5491 The Next (2015 ACM/ICPC Asia Regional Hefei Online)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5491 题目大意: 一个数D(0<=D<231),求比D大的第一个满足:二进制下1个个数在 ...
- (线段树 区间查询)The Water Problem -- hdu -- 5443 (2015 ACM/ICPC Asia Regional Changchun Online)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=5443 The Water Problem Time Limit: 1500/1000 MS (Java/ ...
- 2015 ACM/ICPC Asia Regional Changchun Online HDU - 5441 (离线+并查集)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5441 题意:给你n,m,k,代表n个城市,m条边,k次查询,每次查询输入一个x,然后让你一个城市对(u,v ...
随机推荐
- java涉及父子类的异常
java中的异常涉及到父子类的问题,可以归纳为一句话:子类的构造函数抛出的异常必须包含父类的异常,子类的方法可以选择抛出“范围小于等于”父类的异常或不抛出异常. 1. 为什么构造函数必须抛出包含父类的 ...
- glib的安装(2)
一: glib库的路径: http://ftp.acc.umu.se/pub/GNOME/sources/glib/2.20/ 二: 下载glib库: wget http://ftp.acc. ...
- mysql语句:SET NAMES UTF8
一直以来只知道mysql_query("SET NAMES UTF8");是设定数据库编码的,但是一直不清楚“SET NAMES UTF8”是什么. 直到今天才知道 SET NAM ...
- DataFactory 5.6注册码
一.DataFactory 5.6注册码 数据工厂5.6注册码如下,希望能帮助需求之人 AuthKey: 0-87093-23830-05141-17507 SiteMsg: FREELAND EVO ...
- VUE 之 vuex 和 axios
1.Vuex 部分 1.1 Vuex 是专门为vue.js设计的集中式状态管理架构,其实就是将数据存在一个store中,共各个组件共享使用 1.2 配置: 1.2.1 下载:--npm install ...
- Lily HBase Indexer同步HBase二级索引到Solr丢失数据的问题分析
一.问题描述二.分析步骤2.1 查看日志2.2 修改Solr的硬提交2.3 寻求StackOverFlow帮助2.4 修改了read-row="never"后,丢失部分字段2.5 ...
- rpm的gpg key
1 gpg 这是一种公钥.私钥机制. 2 rpm包的格式 rpm包由四部分构成,lead.signature.header和archive构成. 这里的签名(signature)是加密了的,也就是说, ...
- oracle case where 复杂sql语句
update hr_user u set u.is_approve=(case when u.curr_org_id in (select t.org_id from hr_organization ...
- 浏览器和服务器 对post get请求 url长度限制
1. URL长度限制 2. Post数据的长度限制 3. Cookie的长度限制 1. GET URL长度限制 在Http1.1协议中并没有提出针对URL的长度进行限制,RFC协议里面是这样描述的, ...
- safair 的css hack
在css里面使用[;attribute:value;] css参考如下: .header-share li{float: right; margin-left: 20px; [;width: 50px ...