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

    xiaoxiao2021-03-25  21

    原题:

    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.
    转载请注明原文地址: https://ju.6miu.com/read-200374.html

    最新回复(0)