UVA - 123 Searching Quickly

题目链接

这道题就是给定 一系列ignore词(全部是小写),以::结尾 然后  输入一系列文本,每行不包括ignore词的作为关键词,(与ignore词比较不区分大小写) ,然后排序输出。每一行中可能出现几个关键词,那就以出现顺序先后输出,如果有几行包括了同一个关键词,就以输入时顺序输出,其余的按照字典序排序输出。输出的时候时候除了关键词大写外,其余都要小写。

这道题做的时候有点长,不过幸好1A。

我的思路是先把文本全部转化为小写,然后取出关键词,同时保存它的初始位置在哪一行以及在这一行出现的位置,然后对关键词排序,输出的时候把对应关键词做一个标记,为大写。对应输出就好。

#include<cstdio>
#include<cstring>
#include<ctype.h>
#include<stdlib.h>
struct node
{
    char s[10000];
    int index,p;
}word[10000];  //存储关键词  初始在哪一行   在行中的位置
int cmp(const void* _a,const void* _b)
{
    struct node* a=(node*)_a;
    struct node* b=(node*)_b;
    if(strcmp(a->s,b->s)==0&&a->index!=b->index) return a->index - b->index;
    else if(strcmp(a->s,b->s)==0&&a->index==b->index) return a->p - b->p;
    else return strcmp(a->s,b->s);
}    //先按 初始行下标排序,然后在按 位置排 最后按 字典序排
char s1[100][150]; //ignore
char s2[250][10000]; //title
char str[10000]; //临时保存关键词
bool ans[10000]; //标记数组
int main()
{
    //freopen("a.txt","r",stdin);
    int n=0,m=0,i,j,x=0,jj;
    while(~scanf("%s",s1[n]))
    {
        if(strcmp(s1[n],"::")==0) break;
        n++;
    }
    getchar();
   // for(i=0;i<n;i++)
       // printf("%s\n",s1[i]);
    while(gets(s2[m])) m++;
    for(i=0;i<m;i++)
    {
        int l=strlen(s2[i]);
        for(j=0;j<l;j++)
        {
            if(s2[i][j]>='A'&&s2[i][j]<='Z') s2[i][j]+=32;
        }
    }
   /* for(i=0;i<m;i++)
    {
        printf("%s\n",s2[i]);
    }*/
    for(i=0;i<m;i++)
    {
        memset(str,'\0',sizeof(str));
        int l=strlen(s2[i]),k=0,flag=0;
        //printf("%s\n",s2[i]);
        for(j=0;j<l;j++)
        {
            if(s2[i][j]>='a'&&s2[i][j]<='z') str[k++]=s2[i][j];
            else
            {
               //printf("%s\n",str);
                flag=0;
                for(jj=0;jj<n;jj++)
                {
                    if(strcmp(s1[jj],str)==0) {flag=1;break;}
                }
                if(!flag)
                {
                    strcpy(word[x].s,str);
                    word[x].index=i;
                    word[x].p=j;
                    x++;
                }
                memset(str,'\0',sizeof(str));
                k=0;
            }
        }
        //printf("%s\n",str);
        flag=0;
        for(jj=0;jj<n;jj++)
        {
            if(strcmp(s1[jj],str)==0) {flag=1;break;}
        }
        if(!flag)
        {
            strcpy(word[x].s,str);
            word[x].index=i;
            word[x].p=j;
            x++;
        }
        memset(str,'\0',sizeof(str));
        k=0;
    }
    qsort(word,x,sizeof(word[0]),cmp);
   // for(i=0;i<=x;i++)
       // printf("%s\n",word[i].s);

    for(i=0;i<x;i++)
    {
        int y=word[i].index;
        //printf("%d %d\n",y,word[i].p);
        memset(ans,0,sizeof(ans));
        for(j=word[i].p-strlen(word[i].s);j<word[i].p;j++)
            ans[j]=1; //关键词标记
        for(j=0;j<strlen(s2[y]);j++)
            if(ans[j]) printf("%c",s2[y][j]-32);
        else printf("%c",s2[y][j]);
        printf("\n");
    }
    return 0;
}
时间: 2024-10-10 08:03:40

UVA - 123 Searching Quickly的相关文章

STL --- UVA 123 Searching Quickly

UVA - 123 Searching Quickly Problem's Link:   http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19296 Mean: 有一个字符串集合Ignore,还有一个文本集合TXT,在TXT中除了Ignore中的单词外其他的都是关键字,现在要你根据这些关键字来给TXT文本排序(根据关键字的字典). 注意:一行TXT文本中含多少个关键字就需要排多少次序,如果关键字的字典序相同则按照先后顺序来

Searching Quickly UVA 123

说说:感觉这题目是做得越来越繁琐了.这道题基本上把接下来课设要做的英语词典的框架给做出来了.好像本题的解法就是所谓的倒排索引.先给你一系列的句子,其实就是一系列的词啦.当然里面要把一些词去掉.然后把剩下的每个词都做成索引.最后按字典序把所有词所在的句子都输出就可以了.我的做法是定义了一个结构index包含关键词和一个指针,该指针指向一个链表,链表中的每个节点包含了该关键词所在的句子的位置,以及该关键词在句子中的位置.然后读入词,若不是要忽略的词就判断该词是否已经在关键词表中,在则添加到相应关键词

UVa 12505 Searching in sqrt(n)

传送门 一开始在vjudge上看到这题时,标的来源是CSU 1120,第八届湖南省赛D题“平方根大搜索”.今天交题时CSU突然跪了,后来查了一下看哪家OJ还挂了这道题,竟然发现这题是出自UVA的,而且用的原题. ------------------------------------------------------------------------------------------------------------------ time limit 5s In binary, the

uva 1597 Searching the Web

The word "search engine" may not be strange to you. Generally speaking, a search engine searches the web pages available in the Internet, extracts and organizes the information and responds to users' queries with the most relevant pages. World f

小白书练习题5.5.3 排序检索类、

UVA 340 Master-Mind Hints 题意:猜数字游戏,给n个数的序列给你.接下来一行是答案序列.剩下的都是猜测序列.对于每一个猜测序列,统计有多少个数字相同并且位置相同.有多少数字相同位置不同.每一个数字只能用一次. 思路:直接统计可以求出数字相同并且位置相同的哪一些数.在此过程中我加了一个标记数组.标记那些用过的数的位置为1,没用过为0:然后枚举猜测中哪些没用过的数字.去答案序列中找.当数字相等并且答案行中那个数也没用过时.计数加1: 1 #include<cstdio> 2

UVA题目分类

题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics 10300 - Ecological Premium 458 - The Decoder 494 - Kindergarten Counting Game 414 - Machined Surfaces 490 - Rotating Sentences 445 - Marvelous Mazes

基于STL的字典生成模块-模拟搜索引擎算法的尝试

该课题来源于UVA中Searching the Web的题目:https://vjudge.net/problem/UVA-1597 按照题目的说法,我对按照特定格式输入的文章中的词语合成字典,以满足后期的快速查找. 针对于字典的合成途径,我利用了STL中的map与set的嵌套形成了一种特定的数据结构来解析文章中的单词 1 #include<map> 2 #include<iostream> 3 #include<set> 4 #include<algorithm

2015-05-29股票资料

代码 名称 股价 总市值 所属行业 6日涨幅% 6日换手% 总股本 601628 中国人寿 35.26 9966亿 保险 -3.85 2.77 283亿 601318 中国平安 85.44 7809亿 保险 -1.34 18.87 91.4亿 601601 中国太保 32.23 2921亿 保险 -3.85 10.88 90.6亿 601336 新华保险 58.81 1835亿 保险 -4.53 14.57 31.2亿 600660 福耀玻璃 16.43 412亿 玻璃陶瓷 1.55 23.92

Searching the Web UVA - 1597

链接:https://vjudge.net/problem/UVA-1597#author=0 这题写了我一个晚上,然后debug了一个早上.. 最主要就是AND那一部分,一开始用了一个很奇怪的方法实现,就是利用set递增的性质,设置一个cur变量保存现在遍历到的文章下标的最大值,然后检查s1和s2能否取到,cur每次取当前s1和s2的文章下标最大值.中间实现的时候也出了点bug,没有在遍历到末尾的时候跳出循环.然而这不是重点..重点在于cur不一定取到,也就是可以跳过cur取一个更大的值, 这