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文本中含多少个关键字就需要排多少次序,如果关键字的字典序相同则按照先后顺序来排。

analyse:

这题STL用的比较多,使用STL可以很好的解决去重、排序等一序列问题,而手动实现的话就稍微繁琐一点,思路并不难。

Time complexity: O(n)

Source code: 

1. STL版:

/*
* this code is made by crazyacking
* Problem: UVA 123
* Verdict: Accepted
* Submission Date: 2015-05-03-20.39
* Time: 0MS
* Memory: 0KB
*/
#include <queue>
#include <cstdio>
#include <string>
#include <stack>
#include <cmath>
#include <set>
#include <map>
#include <cstdlib>
#include <climits>
#include <vector>
#include <iostream>
#include <algorithm>
#include <cstring>
#define  MAXN 1000010
#define  LL long long
#define  ULL unsigned long long
using namespace std;

string tmp;
set<string> ignore;
multimap<string,string> mp;

int main()
{
//        freopen("C:\\Users\\crazyacking\\Desktop\\cin.txt","r",stdin);
//        freopen("C:\\Users\\crazyacking\\Desktop\\cout.txt","w",stdout);

        ios_base::sync_with_stdio(false);
        cin.tie(0);
        int len;
        string ig;
        while(getline(cin,ig) && ig!="::")
                ignore.insert(ig);
        mp.clear();
        while(getline(cin,tmp))
        {
                len=tmp.length();
                for(int i=0;i<len;++i)
                        tmp[i]=tolower(tmp[i]);
                string t1;
                int cnt;
                for(int i=0;i<len;++i)
                {
                        if(tmp[i]!=‘ ‘)
                        {
                                cnt=0;
                                int j;
                                t1.clear();
                                for(j=i;j<len;++j)
                                {
                                        if(tmp[j]!=‘ ‘)
                                        {
                                                t1.insert(cnt,1,tmp[j]);
                                                cnt++;
                                                tmp[j]=toupper(tmp[j]);
                                        }
                                        else break;
                                }
                                i=j;
                                if(ignore.find(t1)==ignore.end())
                                        mp.insert(pair<string,string>(t1,tmp));
                                for(j=0;j<len;++j)
                                {
                                        tmp[j]=tolower(tmp[j]);
                                }
                        }
                }
        }
        multimap<string,string> ::iterator iter=mp.begin();
        for(;iter!=mp.end();++iter)
        {
                cout<<(iter->second)<<endl;
        }
        return 0;
}
/*

*/

2.手动模拟:

/*
* this code is made by crazyacking
* Verdict: Accepted
* Submission Date: 2015-05-03-21.52
* Time: 0MS
* Memory: 1347KB
*/
#include <queue>
#include <cstdio>
#include <string>
#include <stack>
#include <cmath>
#include <set>
#include <map>
#include <cstdlib>
#include <climits>
#include <vector>
#include <iostream>
#include <algorithm>
#include <cstring>
#define  MAXN 1000010
#define  LL long long
using namespace std;

struct node
{
    int n;
    char word[20][1500];
    void fun(char *str)
    {
        int len=strlen(str);
        for(int i=0;i<len;i++) str[i]=tolower(str[i]);

        n=0;
        char *strPtr=strtok(str," ");
        while(strPtr!=NULL)
        {
            strcpy(word[n++],strPtr);
            strPtr=strtok(NULL," ");
        }
    }
}title[300];
void output(int t,int pos)
{
    int len=strlen(title[t].word[pos]);
    for(int i=0;i<len;i++)
    {
        title[t].word[pos][i]=toupper(title[t].word[pos][i]);
    }
    for(int i=0;i<title[t].n;i++)
    {
        if(i==0)
        {
            printf("%s",title[t].word[i]);
        }
        else printf(" %s",title[t].word[i]);
    }
    for(int i=0;i<len;i++)
    {
        title[t].word[pos][i]=tolower(title[t].word[pos][i]);
    }
    puts("");
}

int main()
{
        ios_base::sync_with_stdio(false);
        cin.tie(0);
        int n=0;
            set<string> ig,key;
            set<string>::iterator it;
            char temp[20],str[10005];
            while(scanf("%s",temp)!=EOF)
            {
                if(strcmp(temp,"::")==0) break;
                ig.insert(temp);
            }
            while(gets(str))
            {
                title[n].fun(str);
                for(int i=0;i<title[n].n;i++)
                {
                    bool flag=false;
                    for(it=ig.begin();it!=ig.end();it++)
                    {
                        if(strcmp(title[n].word[i],(*it).c_str())==0)
                        {
                            flag=true;break;
                        }
                    }
                    if(!flag) key.insert(title[n].word[i]);
                }
                n++;
            }
            for(it=key.begin();it!=key.end();it++)
            {
                for(int i=0;i<n;i++)
                {
                    for(int j=0;j<title[i].n;j++)
                    {
                        if(strcmp((*it).c_str(),title[i].word[j])==0)
                        {
                            output(i,j);
                        }
                    }
                }
            }
        return 0;
}
/*

*/

时间: 2024-10-12 21:00:23

STL --- UVA 123 Searching Quickly的相关文章

UVA - 123 Searching Quickly

题目链接 这道题就是给定 一系列ignore词(全部是小写),以::结尾 然后  输入一系列文本,每行不包括ignore词的作为关键词,(与ignore词比较不区分大小写) ,然后排序输出.每一行中可能出现几个关键词,那就以出现顺序先后输出,如果有几行包括了同一个关键词,就以输入时顺序输出,其余的按照字典序排序输出.输出的时候时候除了关键词大写外,其余都要小写. 这道题做的时候有点长,不过幸好1A. 我的思路是先把文本全部转化为小写,然后取出关键词,同时保存它的初始位置在哪一行以及在这一行出现的

Searching Quickly UVA 123

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

Brute Force &amp; STL --- UVA 146 ID Codes

 ID Codes  Problem's Link:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=3&problem=82&mosmsg=Submission+received+with+ID+14418598 Mean: 求出可重排列的下一个排列. analyse: 直接用STL来实现就可.自己手动写了一个,并不复杂.

UVa 12505 Searching in sqrt(n)

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

STL UVA 11995 I Can Guess the Data Structure!

题目传送门 题意:训练指南P186 分析:主要为了熟悉STL中的stack,queue,priority_queue,尤其是优先队列从小到大的写法 #include <bits/stdc++.h> using namespace std; int main(void) { int n; while (scanf ("%d", &n) == 1) { stack<int> sta; queue<int> que; priority_queue&

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

STL uva 11991

题意... 某个数第n次出现的位置... #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<algorithm> #include<queue> #include<string> #include<vector> #include<map> us

小白书练习题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