题目大意:
给出n,k,以及长度为n的原字符串
分析:
首先很明显有gcd(n,k)种本质不同的A串(本质相同指的是循环同构),每个长度为
其中gcd(n,k)个不同的串,最大表示法时间O(n/gcd(n,k)),总的时间复杂度即为O(n)。
AC code:
#include <cstdio>
#include <string>
#include <iostream>
#define ONLINE_JUDGE
using namespace std;
int n, k, l, block;
string s, str;
string MAX = "", ans;
int gcd(int a, int b)
{
return b?gcd(b, a%b):a;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("sgu232.in", "r", stdin);
freopen("sgu232.out", "w", stdout);
#endif
ios::sync_with_stdio(0);
cin >> n >> k >> s;
block = gcd(n, k), l = n/gcd(n, k);
for(int i = 0; i < block; ++i)
{
str = s[i];
for(int ti = (i+k)%n; ti != i; ti = (ti+k)%n)
str += s[ti];
str += str;
int a = 0, b = 1;
while(a < l && b < l)
{
int k = 0;
while(str[a+k] == str[b+k] && k < l) k++;
if(k == l) break;
if(str[a+k] > str[b+k]) b += k+1;
else a += k+1;
if(a == b) b++;
}
MAX = max(MAX, str.substr(a, l));
}
for(int i = 1; i <= block; ++i)
ans += MAX;
cout << ans << endl;
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0;
}