题外话
其实以前做过这种循环节的模型的,但是一时没想起来.
当时居然还在用dp和并查集乱搞!下次一定要找到思路再写......
题解
k很大,只要k的因子是漂亮串,k也会是漂亮串
枚举k的因子,然后甚至可以暴力枚举判断多长可行
也就是现在枚举了循环节的长度,有几个循环节
判断是否可行即可.
很明显,设某个字母有x个,x/循环节个数就是该字母能填充的循环节长
把所有字母填充的循环节长加起来,如果大于循环节长度就符合.
#include <bits/stdc++.h>
using namespace std;
int n,k,num[26],ans;
bool isok(int xun,int len)//xun是每个循环节的长度,len是能持续几个循环节
{
for(int i=0;i<=25;i++)
{
xun-=num[i]/len;
if(xun<=0) return true;
}
return false;
}
int main()
{
int t; cin >> t;
while(t--)
{
cin >> n >> k;
string s;
cin >> s;
ans=0;
memset(num,0,sizeof(num));
for(int i=0;i<s.length();i++)
{
num[s[i]-'a']++;
ans=max(ans,num[s[i]-'a']);
}
for(int i=2;i<=k;i++)
{
if(k%i!=0) continue;
int l=1,r=n/i;
while(r>=l)
{
int mid=l+r>>1;
if( isok(i,mid) )
ans=max(ans,mid*i),l=mid+1;
else
r=mid-1;
}
}
cout<<ans<<endl;
}
}