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