UVA-123

来源:互联网 发布:数据分析需要的技能 编辑:程序博客网 时间:2024/06/05 21:16

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;}

代码有点冗长,见谅。

0 0
原创粉丝点击