UVA-123

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

代码有点冗长,见谅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值