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

 

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