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