原题:
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.