cf1367 E. Necklace Assembly(思维)
题意:
在一个小写字符串中取字符组成环形项链,要求项链顺时针旋转 k 个字符后保持不变。问项链最大可取多长。
n,k <= 2000
思路:
长为 n 的环中存在长为 m 的循环节,那么 m 必须既是 n 的约数又是 k 的约数。
这样的循环节有 n/m 个,这就要求一个循环节中的每个字符要在整个环中出现 n/m 次。当然一个循环节中的字符可以有相同的,如果有两个相同的字符,那么整个环中这个字符就要出现 2*n/m 次。
m 越大,每种字符需要出现的次数就越少,就越容易满足条件。所以每次只考虑最大的 m,即 k 与 n 的最大公约数即可。
从大到小暴力找最大的长度。
#include <bits/stdc++.h>
using namespace std;
const int N = 2005;
int n, k, cnt[29]; char ch;
bool check(int n)
{
int m = __gcd(k, n), s = 0;
for(int i = 0; i < 26; i++) s += cnt[i]/(n/m);
return s >= m;
}
signed main()
{
int T; cin >> T; while(T--)
{
scanf("%d%d", &n, &k); memset(cnt, 0, sizeof cnt);
for(int i = 1; i <= n; i++) scanf(" %c", &ch), cnt[ch-'a']++;
sort(cnt, cnt + 26, greater<int>());
while(!check(n)) n--;
printf("%d\n", n);
}
return 0;
}

浙公网安备 33010602011771号