题意
定义完美串,完美串是这个01串在它的所有循环子串中字典序最小的那个串,给你个01串,要你把它分割成完美串,要求分割次数最小。
思路
题目并不难,不过要打得漂亮还是有难度。
可以直接暴力跑,用两指针不断进行比较,前面的字典序大于后面的那就输出即可。
看到别人代码打得简洁明了(比较部分和更新部分),不由得心生敬佩。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e4;
char s[maxn];
int main()
{
int t;
scanf("%d", &t);
while(t--){
scanf("%s", s + 1);
int len = strlen(s + 1);
int r = 1, l = 1;
int j, k;
while(r <= len){
j = l = r;
k = r + 1;
while(k <= len && s[j] <= s[k]){//比较操作
if(s[j] == s[k]){
j++;
}else{
j = r;
}
k++;
}
while(r <= j)
r += k - j;//更新操作
for(int i = l; i < r; ++i)
printf("%c", s[i]);
printf(" ");
}
printf("\n");
}
return 0;
}