tju 3275 Windy's S 最大最小表示板题

缘起

继续最大最小表示~ tju 3275 Windy’s S

分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
给你一串字符串,但是这串字符串是环形的,让你找个位置切开,使得它的字典序最小.

【输入】
多样例. 第一行是样例数. 然后每个样例占据一行——不超过100000个字符的仅由小写字母构成的字符串。

【输出】
对每个样例, 输出最小表示ms(具体含义参见【1】)

【样例输入】
3
aba
ababacdzab
baaabaaaabba

【样例输出】
aab
abababacdz
aaaabbabaaab

【限制】
8s

和【1】几乎一样. 上板子,不解释~ 解释参见【2】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
//#define LOCAL
const int maxn = 1e5+5;
char s[maxn],ss[maxn];
int len;

int getmin()
{
int i = 0,j = 1,k = 0, t;
while(i<len && j<len && k<len)
{
t = s[(i+k)%len]-s[(j+k)%len];
if (!t)
{
++k;
continue;;
}
t>0?i+=k+1:j+=k+1;
if (i==j)
{
++j;
}
k =0;
}
return min(i,j);
}

int main()
{
#ifdef LOCAL
freopen("d:\\data.in", "r", stdin);
// freopen("d:\\my.out", "w", stdout);
#endif
int kase;
scanf("%d", &kase);
while(kase--)
{
scanf("%s", s);
len = strlen(s);
int ms = getmin();
memcpy(ss,s+ms,len-ms);
ss[len-ms] =0;
s[ms] = 0;
strcat(ss, s);
printf("%s\n", ss);
}
return 0;
}

ac情况

Run ID Submit Time Judge Status Prob. Lang. Code Time Memory User
1820150 2019-10-30 16:39:10 Accepted 3275 C++ 0.8K 0’00.03” 1048K yfsyfs

参考

【1】https://yfsyfs.github.io/2019/10/30/poj-1509-Glass-Beads-%E6%9C%80%E5%A4%A7%E6%9C%80%E5%B0%8F%E8%A1%A8%E7%A4%BA%E6%9D%BF%E9%A2%98/

【2】https://yfsyfs.github.io/2019/10/30/hdu-2609-How-many-%E6%9C%80%E5%A4%A7%E6%9C%80%E5%B0%8F%E8%A1%A8%E7%A4%BA%E6%9D%BF%E9%A2%98/