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

 

posted @ 2020-08-04 21:37  N_Yokel  阅读(125)  评论(0编辑  收藏  举报