UVA-123
题意:给一些要忽略的单词,这些单词以外都是关键字,然后给你若干个标题。要你以这些关键字进行排序(当一个标题内存在多个关键字要以每个关键字都参与排序),最后输出。
这题关键有2个:
第一:如何处理字符串,并抓出关键字来进行排序。
——我是把每个标题都小写话,并把每个单词都抓出来,再暴力枚举哪个可以作为关键字,可以的话把所有单词再加成一个关键字大写其他时小写的新标题,建一个struct里面包含新标题和关键字。
第二:输出顺序。
——题目要求:首先关键字按字典序 ,其次相同关键字出现在不同标题中,出现在输入较前位置的标题排在前面,最后同一个关键字在一个标题中出现多次,关键字位于较前位置的排在前面。注意下这个顺序就好来。
剩下的都是细节问题了。
/*************************************************************************
> File Name: UVA-123.cpp
> Author: Narsh
>
> Created Time: 2016年07月10日 星期日 08时41分55秒
************************************************************************/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
using namespace std;
struct node{
string key[60],lines;
int len;
} s[300];
struct node2{
string key,lines;
int x,y; //x记位置, y记输入次序
} ans[11000];
string misskey[300];
int lm,n,lans,len;
bool cmp(const node2 a,const node2 b){
if (a.key == b.key && a.y == b.y) return a.x < b.x;
if (a.key == b.key) return a.y < b.y;
return a.key < b.key;
}
int main () {
freopen ("xx.in","r",stdin);
freopen ("xx.out","w",stdout);
lm=0;
while (true) {
lm++;
cin>>misskey[lm];
if ( misskey[lm] == "::" ) break;
}
char zz;
scanf("%c",&zz);
lm--;
n=0;
string k;
while (getline(cin,s[++n].lines) ){
if (s[n].lines[ s[n].lines.length()-1] != '\n')
s[n].lines = s[n].lines + '\n';
s[n].len = 0;
k="";
for (int i = 0; i < s[n].lines.length(); i++)
if ( s[n].lines[i] !=' ' && s[n].lines[i] != '\n'){
if ( s[n].lines[i] >= 'A' && s[n].lines[i] <= 'Z')
s[n].lines[i] = s[n].lines[i] - 'A' + 'a';
k=k+s[n].lines[i];
}else {
s[n].len++;
s[n].key[s[n].len] = k;
k="";
}
}
bool tag;
lans=0;
for (int t = 1; t <= n; t++)
for (int j = 1; j <= s[t].len; j++){
k = s[t].key[j];
tag = true;
for (int i = 1; i <= lm; i++)
if (k == misskey[i]) {
tag=false;
break;
}
if ( tag ) {
k = "";
len=0;
for (int i = 1; i <= s[t].len; i++)
if (i != j){
k = k +s[t].key[i];
if (i != s[t].len ) k = k + ' ';
len += s[t].key[i].length()+1;
} else {
lans++;
ans[lans].y=t;
ans[lans].key = "";
ans[lans].x = len+1;
for (int l = 0; l < s[t].key[i].length(); l++){
char c;
c = s[t].key[i][l]-'a'+'A';
k = k +c;
ans[lans].key = ans[lans].key + c;
}
if (i != s[t].len ) k = k + ' ';
}
ans[lans].lines = k;
}
}
sort(ans+1,ans+1+lans,cmp);
for (int i = 1; i <= lans; i++)
cout<<ans[i].lines<<endl;
}
代码有点冗长,见谅。