题目
题解思路
根据题目规律,找出要相同的子串的长度。
这里他们一眼出gcd(),我倒是看了很久,还是太菜了。
当2*K < N的时候就是另一种情况,因为这个长度他不能拉伸。
所以这时候重叠的子串长度就只有N - k 。
当知道了重复的区间,我们要让修改的字母数最小,就枚举每个子串的每个位置的众数即可。这是小贪心。
AC代码
#include <bits/stdc++.h>
//#include <unordered_map>
//priority_queue
#define PII pair<int,int>
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int T ;
cin >> T ;
while (T--)
{
string s ;
int n , k , ans = 0 ;
cin >> n >> k ;
cin >> s ;
int p = __gcd(n,k) ;
if ( 2*k > n )
{
p = n - k ;
}
for (int i = 0 ; i < p ; i++ )
{
int ma = -1 ;
char mx ;
int mp[26] = {0} ;
for (int j = i ; j < n ; j += p)
{
mp[s[j] - 'a']++ ;
}
for (int j = 0 ; j < 26 ; j++ )
{
if ( ma < mp[j] )
{
ma = mp[j] ;
mx = j + 'a' ;
}
}
for (int j = i ; j < n ; j += p)
s[j] = mx ;
}
cout << s << "\n" ;
}
return 0 ;
}