E. Necklace Assembly(因子,思维,循环性质)

题外话
, . 其实以前做过这种循环节的模型的,但是一时没想起来.

d p ! . . . . . . 当时居然还在用dp和并查集乱搞!下次一定要找到思路再写......

题解

k , k , k k很大,只要k的因子是漂亮串,k也会是漂亮串

k , 枚举k的因子,然后甚至可以暴力枚举判断多长可行

, 也就是现在枚举了循环节的长度,有几个循环节

. 判断是否可行即可.

, x , x / 很明显,设某个字母有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;
	}
} 

猜你喜欢

转载自blog.csdn.net/jziwjxjd/article/details/106850271