[codeforces 1367E] Necklace Assembly 根据周期进行分块,每块相应位置的字母都需雷同

Codeforces Round #650 (Div. 3)  参与排名人数11978

[codeforces 1367E]   Necklace Assembly   根据周期进行分块,每块相应位置的字母都需雷同

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

在线测评地址https://codeforces.com/contest/1367/problem/E

此篇文章晚写原因,Codeforces网站2020.6.17一直无法访问,直到下午某个时刻才能访问。

Problem Lang Verdict Time Memory
E - Necklace Assembly GNU C++17 Accepted 31 ms 0 KB

题目大意:一根由字母构成的项链,若重复周期是T,那么也可以说重复周期是2T,3T,4T,......。给出包含n个字母的字符串,从中选取字母,构造周期为k的项链,要求项链尽可能的长,试求项链的最大长度。

样例数据构成如下

6 3
abcbac

6
a有2个
b有2个
c有2个

项链构成如下abcabc

3 6
aaa

3
a有3个

项链构成如下aaa

7 1000
abczgyo

5
a有1个
b有1个
c有1个
g有1个
o有1个
y有1个
z有1个
项链构成如下abcgo

5 4
ababa

4
a有3个
b有2个
项链构成如下abab


20 10
aaebdbabdbbddaadaadc

15
a有7个
b有5个
c有1个
d有6个
e有1个
项链构成如下aabbdaabbdaabbd

20 5
ecbedececacbcbccbdec

10
a有1个
b有4个
c有8个
d有2个
e有5个
项链构成如下cecececece

样例模拟如下

20 10
aaebdbabdbbddaadaadc

15

a的数量有7个
b的数量有5个
c的数量有1个
d的数量有6个
e的数量有1个

项链长为15时,gcd(15,10)=5,5是项链的最小周期,
15/5=3表示长度为15的项链分成3块,每块的内容完全雷同。
7/3=2表示每块中可以有2个字母a
5/3=1表示每块中可以有1个字母b
1/3=0表示每块中可以有0个字母c
6/3=2表示每块中可以有2个字母d
1/3=0表示每块中可以有0个字母e

2个字母a,1个字母b,2个字母d,组成一块的数量2+1+2=5>=5(5是项链的最小周期)
项链长为15时,完全能构造出符合题意的项链,项链如下
aabddaabddaabdd

AC代码如下

#include <stdio.h>
char s[2010];
int cnt[30];
int gcd(int a,int b){//最大公约数
	return b?gcd(b,a%b):a;
}
int main(){
	int t,n,k,l,T,block,num,ans,i;//T周期,block表示分块数量,num表示在一个周期中,字母数量
	scanf("%d",&t);
	while(t--){
		ans=0;
		scanf("%d%d%s",&n,&k,s);
		for(i=0;i<26;i++)cnt[i]=0;
		for(i=0;i<n;i++)cnt[s[i]-'a']++;//统计雷同字母数量
		for(l=1;l<=n;l++){//l表示项链长度,自小到大进行尝试
			T=gcd(l,k),block=l/T,num=0;//num表示能凑到同一块中的字母数量
			for(i=0;i<26;i++)
				num+=cnt[i]/block;
			if(num>=T)ans=l;//若能凑出的字母数量超过一个周期,表示这样的项链复合题意
		}
		printf("%d\n",ans);
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章