2020 10.24 洛谷普及模拟
2. 复习大战
1 问题描述
听!考试的钟声敲响了!由远及近。
著名学佛韩学⽔要开始复习期末考试了,他⼀共有
n
n
n 天的时间来复习,每天认真复习⼀⻔
功课。
现在他想知道,经过这
n
n
n 天,每⻔功课他各复习了⼏天。
2 输入格式
第⼀⾏,⼀个整数
n
n
n,表示
n
n
n 天。
接下来
n
n
n ⾏,每⾏⼀个字符串
S
i
Si
Si,代表复习的学科。注意,只要两天复习的科⽬位数不同
或存在⼀位不同(⼤⼩写算不同),那么就是不同的科⽬。
3 输出格式
⼀共
n
n
n⾏,对于每⾏:先输出⼀个字符串,代表科⽬,再输出⼀个空格,最后输出复习的
天数。
要求按照字符串升序输出。
4 样例
输入
10
Chinese
chinese
Maths
Maths
Chinese
History
Oi
OI
oI
oi
输出
Chinese 2
History 1
Maths 2
OI 1
Oi 1
chinese 1
oI 1
oi 1
5 数据规模与约定
保证所有的字符都是可⻅字符。
设 L = max{|Si|}。
对于
60
60
60 的数据,满⾜
n
,
L
<
=
100
n, L <=100
n,L<=100。
对于
100
100
100% 的数据,满⾜
n
,
L
<
=
1000
n, L <=1000
n,L<=1000。
提示
假设字符串
S
1
=
a
1
a
2...
a
n
,
S
2
=
b
1
b
2...
b
m
,
S1 = a1a2 . . . an, S2 = b1b2 . . . bm,
S1=a1a2...an,S2=b1b2...bm, 如果
a
1
a
2...
a
i
=
b
1
b
2...
b
i
a1a2 . . . ai=b1b2 . . . bi
a1a2...ai=b1b2...bi且
a
i
+
1
ai+1
ai+1 <
b
i
+
1
bi+1
bi+1,或
n
<
m
n < m
n<m 且
a
1
a
2...
a
n
=
b
1
b
2...
b
n
a1a2 . . . an = b1b2 . . . bn
a1a2...an=b1b2...bn,就称
S
1
<
S
2
S1 < S2
S1<S2。
⽐较两个字符⼤⼩的⽅法,是⽐较它们
A
S
C
I
I
ASCII
ASCII码的⼤⼩。
代码
c
+
+
S
T
L
c++STL
c++STL自带的
m
a
p
map
map即可映射完成
时间复杂度
O
(
n
∗
L
∗
l
o
g
(
n
)
)
O(n*L*log(n))
O(n∗L∗log(n))
L
L
L为字符串的最大长度
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#include<cstring>
#define r register
#define rep(i,x,y) for(r int i=x;i<=y;++i)
#define per(i,x,y) for(r int i=x;i>=y;--i)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int n,top,v;
string str,s[1010];
map<string,int> f; //好东西
int main()
{
scanf("%d",&n);
rep(i,1,n)
{
cin>>str;
if(f[str]==0)
s[++top]=str;
f[str]++;
}
sort(s+1,s+top+1); //从小到大快速排序
rep(i,1,top)
cout<<s[i]<<" "<<f[s[i]]<<"\n";
return 0;
}