您的位置:首页 > 其它

2017.2.09【初中部 GDKOI】模拟赛B组 昵称 题解

2017-02-10 07:57 267 查看

原题:

http://172.16.0.132/senior/#contest/show/1916/1

题目描述:

ZSUQ Messenger是一款跟腾讯QQ类似的软件。该软件的每个注册用户都拥有一个昵称以标识其身份。由于用户数很多,因此一个昵称可能会被许多不同的用户使用到,例如“Tom”,“Marry”,“Kate”等一些常用名会被频繁使用到。不过ZSUQ公司通过最近的一项调查发现,并没有超过5000个不同的昵称被用户使用到。   作为ZSUQ公司的一个员工,公司将提供给你一份所有用户的昵称名单,并要求你提交一份报告,告诉大家对于每个昵称都有多少用户在使用。

输入:

数据第一行是一个整数N,(1<=N<=100,000),下面N行给出这N个用户的昵称名。每一个昵称名用一个不超过100个字符的字母字符串表示。注意昵称名称对大小写不敏感。

输出:

输出要给出你对昵称用户的统计。按字符串顺序输出每个昵称,并输出该昵称有多少个用户在使用,中间用一个空格隔开。注意一行的首尾不要有多余空格,所有的昵称名均转换为小写字符输出。

样例输入:

4

Carp

infish

peipei

carp

样例输出:

carp 2

infish 1

peipei 1

分析:

首先对字符串数组排序(从小到大),然后(扫一遍统计输出 或 用字典树统计输出)

实现:

var
n,i,j,bz:longint;
s:array[0..100007]of string;
procedure kp(x,y:longint);
var
i,j:longint;
mid:string;
begin
i:=x;
j:=y;
mid:=s[x];
repeat
while s[j]>mid do dec(j);
while s[i]<mid do inc(i);
if i<=j then
begin
s[0]:=s[i];
s[i]:=s[j];
s[j]:=s[0];
inc(i);
dec(j);
end;
until i>j;
if x<j then kp(x,j);
if i<y then kp(i,y);
end;
begin
readln(n);
for i:=1 to n do
begin
readln(s[i]);
for j:=1 to length(s[i]) do
if s[i,j] in ['A'..'Z'] then s[i,j]:=chr(ord(s[i,j])+32);
end;
kp(1,n);
i:=0;
while i<n do
begin
inc(i);
write(s[i],' ');
bz:=1;
while s[i]=s[i+1] do begin inc(i); inc(bz); end;
if i<>n then writeln(bz,' ')
else writeln(bz);
end;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: