题目链接

给你一个字符串, 然后把他想象成一个环。 从某一个地方断开,然后逆时针或顺时针, 都可以形成一个字符串, 求字典序最大的那种。 输出断开位置以及是顺时针还是逆时针。

如果两个一样, 输出位置靠前的一个, 如果位置也一样, 输出顺时针的那个。

显然是一个最大表示法。 麻烦的是逆时针的情况, 因为要输出位置靠前的一个。 但是逆时针求出来的是字符串反转之后靠前的, 所以应该求一遍kmp, 找出来最靠后的一个位置。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
using namespace std;
const int maxn = 4e4+;
int a[maxn], b[maxn], pos[maxn], nxt[maxn], c[maxn];
int getMax(int a[], int n)
{
int i, j, k;
for(i = , j = ; i<n&&j<n; ) {
for(k = ; k<n&&a[i+k]==a[j+k]; k++)
;
if(k>=n)
break;
if(a[i+k]>a[j+k])
j += k+;
else
i += k+;
if(i == j)
j++;
}
return i;
}
int solve(string s, int a[], int n)
{
for(int i = ; i < n; i++) {
a[i] = s[i]-'a';
}
for(int i = n; i < *n-; i++) {
a[i] = a[i-n];
}
int pos = getMax(a, n);
return pos;
}
void init_kmp(int m) {
int i = , j = -;
nxt[] = -;
while(i<m) {
if(j == - || c[i] == c[j]) {
++i, ++j;
nxt[i] = j;
} else {
j = nxt[j];
}
}
}
int kmp(int n)
{
int cnt = ;
int i = , j = ;
while(i<*n-) {
if(j == - || b[i] == c[j]) {
i++, j++;
} else {
j = nxt[j];
}
if(j == n) {
pos[cnt++] = i;
j = nxt[j];
}
}
return cnt;
}
int main()
{
int t, n;
string s;
cin>>t;
while(t--) {
cin>>n>>s;
int pos1 = solve(s, a, n);
int num = , flag = -;
reverse(s.begin(), s.end());
int pos2 = solve(s, b, n);
int tmp1 = pos1, tmp2 = pos2;
while(num < n) {
if(a[pos1] > b[pos2]) {
flag = ;
break;
} else if(a[pos1] < b[pos2]) {
flag = ;
break;
} else {
pos1++;
pos2++;
num++;
}
}
int cnt = ;
for(int i = tmp2; i < tmp2+n; i++) {
c[cnt++] = b[i];
}
init_kmp(n);
cnt = kmp(n);
tmp2 = pos[cnt-]%n;
if(num == n) {
if(tmp1+ <= n-tmp2) {
flag = ;
} else {
flag = ;
}
}
if(flag) {
printf("%d %d\n", tmp1+, !flag);
} else {
printf("%d %d\n", n-tmp2, !flag);
}
}
return ;
}

hdu 5442 Favorite Donut 最大表示法+kmp的更多相关文章

  1. Hdu 5442 Favorite Donut (2015 ACM/ICPC Asia Regional Changchun Online 最大最小表示法 + KMP)

    题目链接: Hdu 5442 Favorite Donut 题目描述: 给出一个文本串,找出顺时针或者逆时针循环旋转后,字典序最大的那个字符串,字典序最大的字符串如果有多个,就输出下标最小的那个,如果 ...

  2. HDU 5442——Favorite Donut——————【最大表示法+kmp | 后缀数组】

    Favorite Donut Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  3. HDU 5442 Favorite Donut(暴力 or 后缀数组 or 最大表示法)

    http://acm.hdu.edu.cn/showproblem.php?pid=5442 题意:给出一串字符串,它是循环的,现在要选定一个起点,使得该字符串字典序最大(顺时针和逆时针均可),如果有 ...

  4. hdu 5442 Favorite Donut 后缀数组

    Favorite Donut Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid ...

  5. HDU 5442 Favorite Donut

    Favorite Donut Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  6. 【HDU - 5442】Favorite Donut 【最大表示法+KMP/后缀数组】

    题意 给出一个长度为n的环状由小写字母组成的序列,请找出从何处断开,顺时针还是逆时针,使得字典序最大.如果两个字符串的字典序一样大,那么它会选择下下标最小的那个.如果某个点顺时针逆时针产生的字典序大小 ...

  7. HDU 1711 Number Sequence (字符串匹配,KMP算法)

    HDU 1711 Number Sequence (字符串匹配,KMP算法) Description Given two sequences of numbers : a1, a2, ...... , ...

  8. Favorite Donut(HDU 5442)最小表示法+二分

    题目给出一个字符串,由a~z表示甜度,随字典序增大,字符串首尾相连形成一个圈,要求从一个位置开始字典序最大的字符串,输出位置以及是顺时针还是逆时针表示.顺时针用0表示,逆时针用1表示. 此题只需要查找 ...

  9. HDU 3374 最小/大表示法+KMP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374 题意:给定一个串s,该串有strlen(s)个循环同构串,要求输出字典序最小的同构串的下标,字典 ...

随机推荐

  1. react tab选项卡切换

    Tab选项卡切换是个很常见也很简单的小功能,用原生js和jq去写的话可能不到20行代码就搞定so easy.但是用react去实现就没那么容易了(是自己react比较菜).由于最近在重新学习react ...

  2. node.js入门(二) 第一个程序 Hello World

    新建一个名为"hello.js"文本文件,然后输入如下内容 //载入http模块 var http = require('http'); //构建一个http服务器 var ser ...

  3. atoi atol strtod strtol strtoul _gcvt

    如果以下函数,您在使用的时候,总是输出一个莫名的值,是因为您忘记了引用头文件 #include <stdlib.h> 1- atoi int atoi(const char *nptr); ...

  4. Python第一天-----简单登录验证

    ----------------------------------------- 编写登录接口 要求:1.输入用户名密码 2.认证成功后显示欢迎信息 3.输错三次后锁定 -------------- ...

  5. 小记:对Android网络下载工具的初步封装!(包括json,字符串下载(volley),和图片下载(glide))

    import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkIn ...

  6. jquery hover延时

    var timer;    //绑定hover事件    $(function () {         $(".centercy img").hover(showPic, hid ...

  7. 检测android的版本的办法

    http://www.cnblogs.com/wzh206/archive/2010/05/02/1726076.html 如何判断Android系统的版本 随着Android版本的增多,在不同的版本 ...

  8. 我所不知道的 Chrome 开发者工具

    http://www.oschina.net/translate/things-i-didnt-know-about-chrome-devtools 自打我开始进行Web开发后,我就一直将Firebu ...

  9. 切图教程,APP切图实例

  10. java设计模式--行为型模式--命令模式

    命令模式 概述 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作. 适用性 .抽象出待执行的动作以参数化某对象. .在不同的时刻指定.排 ...