#include<bits/stdc++.h>
#define debug(x) cerr<<#x<<"="<<(x)<<endl;
using namespace std;
inline void write(int x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>9)
write(x/10);
putchar(x%10+'0');
}
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')
f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int s1[50],s2[50][50],s3[50][50][50];
string s[100005];
int main()
{
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
ios::sync_with_stdio(false);
int n=read();
for(int i=1;i<=n;++i)
{
cin>>s[i];
if(s[i].size()==1)
++s1[s[i][0]-'a'];
else if(s[i].size()==2)
{
++s2[s[i][0]-'a'][s[i][1]-'a'];
}
else
{
++s3[s[i][0]-'a'][s[i][1]-'a'][s[i][2]-'a'];
}
}
int maxsize=0;
string maxx="";
for(int i=0;i<=26;++i)
{
if(s1[i]>maxsize)
{
maxx=i+'a';
maxsize=s1[i];
}
}
for(int i=0;i<=26;++i)
{
for(int j=0;j<=26;++j)
{
if(s2[i][j]>maxsize)
{
maxx=i+'a';
maxx+=j+'a';
maxsize=s2[i][j];
}
}
}
for(int i=0;i<=26;++i)
{
for(int j=0;j<=26;++j)
{
for(int k=0;k<=26;++k)
{
if(s3[i][j][k]>maxsize)
{
maxx=i+'a';
maxx+=j+'a';
maxx+=k+'a';
maxsize=s3[i][j][k];
}
}
}
}
cout<<maxx<<endl;
return 0;
}
题目
百度百科中对字典序的通俗解释如下——
设想一本英语字典里的单词,何者在前何者在后?
显然的做法是先按照第一个字母、以 a、b、c……z 的顺序排列;如果第一个字母一样,那么比较第二个、第三个乃至后面的字母。如果比到最后两个单词不一样长(比如,sigh 和 sight),那么把短者排在前。
李华发现班级里有很多同学的首字母缩写相同,比如李华的首字母缩写和“刘瀚”,“林泓”的一样,都是lh。
他希望你帮他统计一下班级里出现次数最多的名字缩写。(若有多个名字缩写出现次数相同,输出其中字典序最小的一个。)
输入第一行包括一个正整数n,表示班级人数。
输入第二行包括n个用空格隔开的字符串,每个字符串长度为2或3,Si表示第i个同学的名字缩写。
输出一个长度为2~3的字符串,表示出现次数最多的名字缩写。(若有多个名字缩写出现次数相同,输出其中字典序最小的一个。)
4
lh lz lh lz
lh
保证输入字符串的长度为2~3,且仅由小写字母组成(26种小写字母均可能作为输入字符)。