其他分享
首页 > 其他分享> > cf1367 E. Necklace Assembly(思维)

cf1367 E. Necklace Assembly(思维)

作者:互联网

题意:

在一个小写字符串中取字符组成环形项链,要求项链顺时针旋转 k 个字符后保持不变。问项链最大可取多长。

n,k <= 2000

思路:

长为 len 的环中存在长为 m 的循环节。那么 m 必须既是 len 的约数又是 k 的约数。

这样的循环节有 len/m 个,这就要求一个循环节中的每个字符要在整个环中出现 len/m 次。当然一个循环节中的字符不必两两不同,如果有两个相同的字符,那么整个环中这个字符就要出现 2*len/m 次。

m 越大,每种字符需要出现的次数就越少,就越容易满足条件。所以每次判断最大的 m,即 k 与 len 的最大公约数即可。

从大到小暴力找最大的长度。

#include <bits/stdc++.h>
using namespace std;
const int N = 2005;
int n, k, cnt[29]; char ch;

bool check(int len)
{
    int m = __gcd(k, len), s = 0;
    for(int i = 0; i < 26; i++) s += cnt[i]/(len/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>());

    int len = n; while(!check(len)) len--;

    printf("%d\n", len);
}

    return 0;
}

标签:字符,cnt,Assembly,int,len,Necklace,循环,项链,cf1367
来源: https://www.cnblogs.com/wushansinger/p/15731223.html