Description
Robin是一只极其聪明的鸟,他着迷于人类丰富多彩的语言。经过长时间的摸索,Robin模仿人类的英语创造了鸟类的语言。与英语类似,这种鸟语的基本单位也是由26个小写英文字母a至z组成。同时,若干个字母组成一个单词,用来表达一定的意思(和英语一样?!),相邻两个单词用一个空格隔开。Robin为他新发明的鸟语创造了丰富的词汇,并花大量精力写出一本鸟语字典。正如你所想的那样,Robin想把一些英文的书籍(如《时间简史》、《物种起源》)翻译成鸟语。但是这项工作实在是太浩大了,以致于Robin无法完成,聪明的Robin想到使用计算机,他编写了一个自动翻译的程序来翻译这些书籍。但是很快他发现,有很多词汇是他原先没有想到的。对于这种情况,他的自动翻译程序将会不对其做翻译,而是直接放入译文。
下面是一个例子,字典中只有4个英文单词及其鸟语含义。给出下列一个英文句子:I am a clever bird.
翻译后的鸟语语句为:op dg a clever myself.
现在,Robin已经翻译了一些著作,他希望补充他的鸟语字典。因此,他想知道有多少单词在他的鸟语字典里是没有的,并且他想统计出在这些没有出现在他的鸟语字典中的单词中,出现次数最多的单词是哪一个?
Sample Input
3
ae
jd
opd
ae jd . jda opq jda ae. ld jd opq!
Sample Output
3
jda
opq
Hint
100%的数据:1≤n≤10000。
set直接做就好了 就是输入进来有点恶心。。。
#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
using namespace std;
int N,M,K,Tot;
string Ans[20005];
set<string> Set;
map<string,int> Cnt;
struct Node{
int l;
string s;
}Q[20005];
bool Cmp(Node i,Node j){
if(i.l!=j.l)
return i.l<=j.l;
return i.s<j.s;
}
int main(){
int i,l,mx=0;
string s;
ios::sync_with_stdio(false);
cin>>N;
for(i=1;i<=N;i++){
cin>>s;
Set.insert(s);
}
while(!cin.eof()){
cin>>s;
l=s.length(),i=0;
while(i<l&&s[i]>='a'&&s[i]<='z')
i++;
if(i){
Q[++M].s=s.substr(0,i);
Q[M].l=Q[M].s.length();
Cnt[Q[M].s]++;
}
}
sort(Q+1,Q+M+1,Cmp);
for(i=1;i<=M;i++)
if((i==1||Q[i].s!=Q[i-1].s)&&!Set.count(Q[i].s)){
K++;
if(Cnt[Q[i].s]>mx){
Ans[Tot=1]=Q[i].s;
mx=Cnt[Q[i].s];
}
else if(Cnt[Q[i].s]==mx)
Ans[++Tot]=Q[i].s;
}
cout<<K<<endl;
for(i=1;i<=Tot;i++)
cout<<Ans[i]<<endl;
return 0;
}