普通的字符串处理
用map比较方便
#include <iostream>
#include <memory.h>
#include <map>
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn=105;
char buf[maxn];
map<string,int>cnt;
map<int,vector<string> >mvs;
int main(){
int t,n;
scanf("%d",&t);
while(t--){
cnt.clear();
mvs.clear();
scanf("%d",&n);
getchar();
while(n--){
gets(buf);
int len=strlen(buf);
for (int i=0;i<len;++i){
if(!isalpha(buf[i]))buf[i]=' ';
}
char *str=strtok(buf," ");
while(str){
string s=str;
for(int i=0;i<s.size();++i){
s[i]=tolower(s[i]);
}
cnt[s]++;
str=strtok(NULL," ");
}
}
map<string,int>::iterator it=cnt.begin();
for(;it!=cnt.end();++it){
if(it->second>=2){
mvs[it->second].push_back(it->first);
}
}
map<int,vector<string> >::reverse_iterator it2=mvs.rbegin();
int c=0;
for(;it2!=mvs.rend();++it2){
vector<string>v;
int maxv=0;
for(int i=0;i<it2->second.size();++i){
maxv=max(maxv,(int)(it2->second[i].size()));
}
for(int i=0;i<it2->second.size();++i){
if(it2->second[i].size()==maxv){
v.push_back(it2->second[i]);
}
}
if(c>0)printf(" ");
if(v.size()>1){
sort(v.begin(),v.end());
printf("%s",v[v.size()-2].c_str());
}else{
printf("%s",v[0].c_str());
}
++c;
}
printf("\n");
}
}