Codeforces 1367E Necklace Assembly(二分)
题意:给出长度为n的字符串,和K,要求用这些字符构造最长的一个字符串的环满足顺时针旋转K次后和之前一样,求最长的长度。n<2e3
题解:暴力枚举K的所有因子为Ki,二分判断对于一个字符串环的它的循环次数最多是多少,L=1,R=N/Ki,满足条件即更新答案。
#include <bits/stdc++.h> #define IO_read ios::sync_with_stdio(false);cin.tie(0) #define fre freopen("C:\\in.txt", "r", stdin) #define _for(i,a,b) for(int i=a; i< b; i++) #define _rep(i,a,b) for(int i=a; i<=b; i++) #define inf 0x3f3f3f3f #define lowbit(a) ((a)&-(a)) using namespace std; typedef long long ll; template <class T> void read(T &x) { char c; bool op=0; while(c=getchar(), c<'0'||c>'9') if(c=='-') op=1; x=c-'0'; while(c=getchar(), c>='0'&&c<='9') x=x*10+c-'0'; if(op) x=-x; } const int maxn=2e3+5; int T, n, k, num[maxn]; char s[maxn]; int check(int x, int y) { int cnt=0; for(int i=1; i<=26; i++) cnt+=num[i]/y; return cnt>=x; } int main() { //fre; read(T); while(T--) { read(n), read(k); scanf("%s", s+1); for(int i=1; i<=26; i++) num[i]=0; _rep(i, 1, n) num[s[i]-'a'+1]++; int ans=1; for(int i=1; i<=k; i++) { if(k%i) continue; int l=1, r=n/i; while(l<=r){ int mid=(l+r)>>1; if(check(i, mid)) ans=max(ans, mid*i), l=mid+1; else r=mid-1; } } printf("%d\n", ans); } return 0; }