UVA123-快速查找

哇塞,这个题我一遍过。我也是惊喜万分啊,哈哈
这个题我猛地看到
真的是一点头绪没有,想了一个钟头,终于有思路了
但是又觉得自己的太麻烦,
就想放弃,想看看人家的结题报告,
幸亏我看到了博客上的一篇文章,让我放弃了这个念头。终于从上午到现在,我不断地写,不断地改,终于按照自己的西路写了出来
而且是一遍过;
这个题真的是写起来很麻烦的,只有这一点,我最后也客服了、以后还是按照自己的思路来做 ,
按照自己的思路写出来之后,再看人家的结题报告。学学人家的算法,或简洁的编程语言!!


思路:
1、读进忽略词
2、读进title
3、利用忽略词,在title中查找关键词,
4、将关键词放入另一个结构体中记下它的title序号和word序号,
5、利用快排,将结构体按照字典序排序,不要忘了对所有的keyword进行toupper()。

6、输出,对每行的唯一的keyword进行toupper(),其他的一律tolower();


#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
using namespace std;
string key[50];
struct  title
{
    int len;
    string b[15];
};
struct  alpha
{
    int i, j;
    string c;
};
alpha str[3000];
title t[200];
string temp;
string & mylower(int i, int j)
{
    temp = "";
    int len = t[i].b[j].size();
    for(int k = 0; k < len; k++)
    {
        temp+=tolower(t[i].b[j][k]);
    }
    return temp;
}
string & myupper(int i, int j)
{
    temp = "";
    int len = t[i].b[j].size();
    for(int k = 0; k < len; k++)
    {
        temp+=toupper(t[i].b[j][k]);
    }
    return temp;
}
int com (const void *a,const void *b)
{
    alpha * c = (alpha*)a;
    alpha * d = (alpha*)b;
    if(strcmp(c->c.data(),d->c.data())!=0)
        return strcmp(c->c.data(),d->c.data());
    else if(c->i-d->i!=0)
        return c->i-d->i;
    else return c->j-d->i;
}
int main ()
{
    int i = 0, j = 0, num =  0;
    string d;
    int flag = 0;
    for(i = 0;; i++)
    {
        getline(cin,key[i]);
        //cout<<key[i]<<endl;
        if(key[i].size() == 2&& key[i][0]==':'&&key[i][1] == ':')
        {
            i;
            break;
        }
    }
    int bnum = 0;
    while(cin>>t[j].b[bnum++])
    {
        if(cin.get() == '\n')
        {
            j++ ;t[j-1].len = bnum;
            bnum = 0;

        }
    }
    for(int k = 0; k < j; k++)
    {
        for(int h = 0; h < t[k].len; h++)
        {
            flag = 0;
            d = mylower(k,h);//
            for(int u = 0; u < i; u++)
            {//cout<<key[u]<<"-->"<<d<<endl;
                if(key[u]==d)
                {//cout<<key[u]<<"=="<<d<<endl;
                    flag =  1;
                    break;
                }
            }
            if(!flag)
            {
                str[num++].c = d;
                //cout<<"COPY:"<<d<<endl;
                str[num-1].i = k;
                str[num-1].j = h;
            }
        }
    }
    qsort(str,num,sizeof(str[0]),com);
    for(int y = 0; y < num; y++)
    {
        int row = str[y].i;
        int cl  = str[y].j;
        int len = t[row].len;
        for(int x = 0; x < len ; x++)
        {
            if(x == cl)cout<<myupper(row,x);
            else cout<<mylower(row,x);
            if(x!=len-1)cout<<" ";
        }
        cout<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值