用stl做,觉得不难的。。结果排序的时候蛋疼,后来用了两个map来排序,终于ac了
题目的输入处理也有点烦。。
大意是:<text> 表示新的一天,然后输入许多单词, </text>表示这一天单词结束
输入<top n/>表示询问,叫你输入最近7天,次数出现前n多的单词
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
#define mnx 25
char ch[mnx], s[7][20000][25];
int cnt[7];
struct cmp{
bool operator () ( const int &a, const int &b ){
return a > b;
}
};
int main(){
int cur = 0;
while( gets(ch) ){
if( ch[0] == '<' && ch[1] == 't' && ch[2] == 'o' ){
map< string, int > m1; //给字符串排序
map< string, int > ::iterator it;
map< int, vector< string >, cmp > m2; //对出现次数排序
map< int, vector< string >, cmp > :: iterator iter;
for( int i = 0; i < 7; i++ ){
for( int j = 0; j < cnt[i]; j++ ){
m1[s[i][j]]++;
}
}
for( it = m1.begin(); it != m1.end(); ++it ){
m2[it->second].push_back(it->first); //把m1的移动到m2里面去,从而给次数排序
}
int num = 0;
for( int i = 5; i < 7; i++ ){
if( ch[i] >= '0' && ch[i] <= '9' )
num = num * 10 + ( ch[i] - '0' );
}
printf("<top %d>\n", num);
int e = 0;
for( iter = m2.begin(); iter != m2.end(); ++iter ){
int len = iter->second.size();
e += len;
for( int i = 0; i < len; i++ ){
printf("%s %d\n", iter->second[i].c_str(), iter->first);
}
if( e >= num ) break;
}
printf("</top>\n");
}
else if( ch[0] == '<' && ch[1] == 't' && ch[2] == 'e' ){
cnt[cur%7] = 0; //最近7天,cur要mod7
while( cin>>ch ){
if( strlen(ch) < 4 ) continue;
if( ch[0] == '<' && ch[1] == '/' && ch[2] == 't' ){
getchar();
cur++;
break;
}
strcpy( s[cur%7][cnt[cur%7]++], ch );
}
}
}
return 0;
}