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;
}

posted @ 2021-12-25 18:58  Bellala  阅读(56)  评论(0)    收藏  举报