【2020CCPC网络赛1007 CCPC Training Class】题目+题解
1007 CCPC Training Class

问题描述:
小火山正在帮助他的CCPC教练准备一个新的CCPC训练比赛,他想生成关于边链树的高质量数据(不需要知道边链树是什么),但是遇到了一些麻烦,你能帮他一下吗?
在本段中,我们正式定义了数据质量问题,对于一些字符串s=s1s2s3···sn,我们使用s[ l:r ]表示从l到r的子字符串,如果l>r,则s[ l:r ]为空。 我们进一步的定义:
![]()
表示第i个位置的最长边,则定义D(i)表示第i个位置的边链长度:

该字符串的质量W定义为D的最大值:

为了防止用单纯的蛮力算法区分边界树,小火山需要生成字符串,使其质量W尽可能大。现在给定一个字符串s, 你可以任意排列该字符串。你们能计算出字符串排列后能达到的最大质量是多少吗?
输入:
在第一行有一个数字T(T < 20),表示测试用例的数量。
在接下来的T行中,每一行都有一个字符串s (1 ≤ |s| ≤ 105),表示输入字符串,所有输入都是小写形式。
输出:
输出T行,对于每一行,你需要输出“Case #T: m" (不带引号),其中T是这个测试用例的次序,m是您在排列之后可以达到的最大质量。
题目大意:
签到题,对于字符串s,定义Lborderi 为“s最长的不为s的前缀使得该前缀是s的后缀”,定义D(i) = D(Lborderi)+1,当s为空则D(i) = 0。
思路:
开始没看懂题意,但是根据样例猜测是出现最多的字母个数,AC。
参考代码:
1 #include <iostream> 2 #include <string> 3 #include <stdio.h> 4 5 using namespace std; 6 7 int main() 8 { 9 int T,b=1; 10 cin>>T; 11 while(T--) 12 { 13 char n[10000]; 14 int a[26]={0},c; 15 cin>>n; 16 for(int i=0;n[i]!=0;i++) 17 { 18 if(n[i]>='a' && n[i]<='z') 19 a[n[i]-'a']++; 20 } 21 c=a[0]; 22 for(int i=0;i<26;i++) 23 { 24 if(a[i]>=c) 25 c=a[i]; 26 } 27 cout<<"Case #"<<b<<": "<<c<<endl; 28 b++; 29 } 30 return 0; 31 }

浙公网安备 33010602011771号