Description
Oliver为了学号英语决定苦背单词,但很快他发现要直接记住杂乱无章的单词非常困难,他决定对单词进行分类。 两个单词可以分为一类当且仅当组成这两个单词的各个字母的数量均相等。 例如“AABAC”,它和“CBAAA”就可以归为一类,而和“AAABB”就不是一类。 现在Oliver有N个单词,所有单词均由大写字母组成,每个单词的长度不超过100.你要告诉Oliver这些单词会被分成几类。
Input
输入文件的第一行为单词个数N,以下N行每行为一个单词。
Output
输出文件仅包含一个数,表示这N个单词分成的类数。
Sample Input
3
AABAC
CBAAA
AAABB
Sample Output
2
Hint
【数据范围】 对于70%的数据满足N<=100。 对于100%的数据满足N<=10000。
给每个字符串排序,再给所有的排序,一个for找相同为一组的就好了,不同的一组
const maxn=100000; var s:array[0..maxn] of string; temp:char; i,j,n,k,ans:longint; procedure qsort(l,r:longint); var i,j:longint; mid:string; begin i:=l; j:=r; mid:=s[(l+r) div 2]; whilei<j do begin whiles[i]>mid do inc(i); whiles[j]<mid do dec(j); ifi<=j then begin s[0]:=s[i]; s[i]:=s[j]; s[j]:=s[0]; inc(i); dec(j); end; end; ifl<j then qsort(l,j); ifr>i then qsort(i,r); end; begin readln(n); fori:=1 to n do begin readln(s[i]); forj:=1 to length(s[i])-1 do fork:=j+1 to length(s[i]) do ifs[i,j]<s[i,k] then begin temp:=s[i,j]; s[i,j]:=s[i,k]; s[i,k]:=temp; end; end; qsort(1,n); ans:=1; fori:=1 to n-1 do ifs[i]<>s[i+1] then inc(ans); writeln(ans); end.
