【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,定义Lborder为“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 }
posted @ 2020-09-22 11:03  宇宙发动机  阅读(491)  评论(0)    收藏  举报