紫书第五章习题 5-10 UVa1597-searching the web

Uva1597 -Searching the Web Uva1597 -Searching the Web 输入n篇文章和m个询问,格式如下: 1、A:搜索包含关键字A的文章,按顺序输出所有包含关键字的行A AND         2、B:搜索包含关键字A和B的文章,按顺序输出所有包含关键字的行 3、A OR B:搜索包含关键字A或B的文章,按顺序输出所有包含关键字的行    4、NOT A:搜索不包含关键字A的文章,按顺序输出所有不包含关键字 阅读详情

出处:https://blog.youkuaiyun.com/u014800748/article/details/44624989

题目链接:https://vjudge.net/contest/231030#problem/J

本题要求模拟一个搜索引擎,该引擎可以处理四种搜索方式:term,term1 AND term2,term1 OR term2,NOT term。在题目描述部分已经介绍了搜索引擎的搭建方式,理论上只需要按照题意搭建即可,不过这样的话,代码会很长,由于中间还要输出一些分隔符来区分文章或者询问,代码长度至少快300行了。这样的代码难以维护,而且在比赛中也不切实际,因此需要进行再优化。

由于需要建立每个关键词和对应的文章,段落的映射,因此想到可以使用map。为了便于处理,这里指记录关键词与行之间的映射关系,同时用limit数组来标记每篇文章的边界行。由于一共有四种查询方式,为了便于处理不同的查询方式,再设一个mark数组,来标记该查询方式下的行号。

那么最后一个问题,如何处理两种不同的分隔符。通过观察可以发现,dash分隔符出现在上一次有输出的情况下,equal分隔符出现在每次查询的末尾。这样以来,只需要用两个标记变量hasOut,needOut来判断上一次是否有过输出并且dash分隔符是否需要输出即可,具体实现方式见代码注释。

本题的一个重要技巧是定义Bit来表示一个所有行的标记数组,即 tyoedef bool Bit[1505],还有一个技巧是活用逻辑运算符来计算mark数组。另外需要注意输入n,m时要多打一个空格,抵消掉换行符,否则会WA。


    #define _CRT_SECURE_NO_WARNINGS   
    #include<iostream>  
    #include<algorithm>  
    #include<string>  
    #include<sstream>  
    #include<set>  
    #include<vector>  
    #include<stack>  
    #include<map>  
    #include<queue>  
    #include<deque>  
    #include<cstdlib>  
    #include<cstdio>  
    #include<cstring>  
    #include<cmath>  
    #include<ctime>  
    #include<functional>  
    using namespace std;  
      
    #define N 1505  
    #define rep(i,n) for(int i=0;i<(n);i++)  
    #define FOR for(int j=limit[i];j<limit[i+1];j++)  
    typedef bool Bit[N];  
    map<string, Bit>Index;  
    string doc[N];  
    int limit[105];  
    int n, lines, m;  
    void update(string s, int p)  
    {  
        string word;  
        string::iterator it = s.begin();  
        for (it; it != s.end();it++)  
        if (isalpha(*it))*it = tolower(*it);  
        else *it = ' ';  
        stringstream ss(s);  
        while (ss >> word)Index[word][p] = true;  
    }  
    int main() {  
        //文档数据输入  
        //freopen("t.txt", "r", stdin);  
        scanf("%d ", &n);//注意,要多打一个空格,抵消掉换行符  
        rep(i, n) {  
            limit[i] = lines;  
            while (getline(cin, doc[lines]), doc[lines] != "**********") {  
                update(doc[lines], lines);  
                lines++;  
            }  
        }  
        limit[n] = lines;//为了便于用FOR统一处理  
      
        //对获取的请求输出对应的内容  
        string  s;                      // s存储每次得到的请求  
        Bit     mark;                   //记录哪些行应该输出  
        //mark的解释: 因为每篇文档要用10个'-'隔开,比较麻烦,最后统一处理  
        bool    *A, *B;  
      
        scanf("%d ", &m);//多打一个空格,方便处理多余的字符  
        while (m--)  
        {  
            getline(cin, s);  
      
            //计算出mark中介  
            if (s[0] == 'N')   
            {  
                A = Index[s.substr(4)];  
                rep(i, n) {  
                    bool logo = true;  
                    FOR if (A[j]) { logo = false; break; }  
                    FOR mark[j] = logo;  
                }  
            }  
            else if (s.find("AND") != string::npos)   
            {  
                int p = s.find(" AND ");  
                A = Index[s.substr(0, p)];  
                B = Index[s.substr(p + 5)];  
                memset(mark, 0, sizeof(mark));  
                bool hasA, hasB;    // 在同一文章中, 两个词是否都出现  
                rep(i, n)   
                {  
                    hasA = hasB = false;    // 默认没出现  
                    FOR if (A[j]) { hasA = true; break; }  
                    FOR if (B[j]) { hasB = true; break; }  
                    if (!(hasA&&hasB)) continue;  
                    FOR mark[j] = (A[j] || B[j]);  
                }  
            }  
            else if (s.find("OR") != string::npos)   
            {  
                int p = s.find(" OR ");  
                A = Index[s.substr(0, p)];  
                B = Index[s.substr(p + 4)];  
                rep(i, lines) mark[i] = (A[i] || B[i]);  
            }  
            else memcpy(mark, Index[s], sizeof(mark));  
      
            //{subsection: 输出mark  
            bool hasOut = false, needOut = false;    // 记录上一轮是否有输出文档  
            rep(i, n)   
            {  
                if (hasOut) needOut = true;  
                hasOut = false;  
                FOR if (mark[j])   
                {  
                    if (needOut)   
                    {  
                        cout << "----------\n";  
                        needOut = false;  
                    }  
                    cout << doc[j] << "\n";  
                    hasOut = true;  
                }  
            }  
            if (!(needOut || hasOut)) cout << "Sorry, I found nothing.\n";//如果有过输出,必然有一个为true  
            cout << "==========\n";  
        }  
        return 0;  
    }  

小华半导体HC32芯片开发使用说明 HC32F/L系列MCU在Keil MDK和IAR Workbench环境下通过工程样例进行软件开发。 阅读详情

相关推荐

ArcGIS Enterprise10.9.1的Windows安装部署

ArcGIS Enterprise10.9.1中Windows版本安装介绍。

qq_36250702的博客 2446

习题5-10 在Web中搜索(Searching the Web, UVa1597)

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define CLOSE() ios::sync_with_stdio(false) #defin

%%% 369

VMware17安装教程(附安装包)VMware17小白详细一键安装教程

VMware 17.5 是一款强大的虚拟机软件。本安装教程将为您详细介绍VMware17安装教程其下载、安装步骤及验证方法,助您轻松完成安装,开启虚拟化体验。

2501_91538706的博客 2万+

习题5-10 在Web中搜索(Searching theWeb,ACM/ICPC Beijing 2004,UVa1597)

原题链接:https://vjudge.net/problem/UVA-1597 分类:STL综合 备注:中级模拟 前言:题目真的不难,但是我的代码做不出我想要的结果。debug好久才发现自己踩了个STL的坑!我用了map<string,set<int> >来记录每个单词在段落的哪些行出现过,但是如果map里面没有这个string时map.count(string)为假,但...

TK_wang_的博客 446

Android-音频配置文件详解

前言:   Android P 引入了一种新的音频政策配置文件格式 (XML),用于描述音频拓扑。新的 XML 文件支持定义输出输入流配置文件、可用于播放和捕获的设备以及音频属性的数量和类型。但是每个项目的代码里面都有很多音频配置文件,具体使用的是哪个文件呢?本文将详细讲述。 1. 查看运行时具体使用的xml adb shell dumpsys media.audio_policy | grep -iE "Config source:" 结果如下: Config source: /vendor

cheriyou_的博客 3946

IFRS 9与CECL对比解析:跨国企业财务必须掌握的两种信用损失模型

本文深度解析IFRS 9与CECL两种信用损失模型的差异,帮助跨国企业应对财务合规挑战。从基础架构、数据治理到监管策略,详细对比三阶段模型与单一阶段模型的核心区别,并提供实施双轨制的实务建议,助力企业优化资本管理和税务筹划。

3c4x5z6v7b的博客 668

习题5-10 在Web中搜索 UVa1597

1.题目描述:点击打开链接 2.解题思路:本题要求模拟一个搜索引擎,该引擎可以处理四种搜索方式:term,term1 AND term2,term1 OR term2,NOT term。在题目描述部分已经介绍了搜索引擎的搭建方式,理论上只需要按照题意搭建即可,不过这样的话,代码会很长,由于中间还要输出一些分隔符来区分文章或者询问,代码长度至少快300行了。这样的代码难以维护,而且在比赛中也不切实

Skyline 1897

避开这5个坑!用MATLAB做核密度估计时90%人会犯的错误

本文详细解析了使用MATLAB进行核密度估计时常见的5个高频错误,包括三维数据可视化、带宽参数优化、大数据量处理、核函数选择及版本兼容性问题。特别针对核密度估计中的关键参数带宽(bandwidth)提供了数据驱动的优化策略,帮助用户提升分析精度与效率。

jenkins8butler的博客 277

UVA1597 在Web中搜索 Searching the Web

主要的思路就是,输入的时候的处理,首先我们要把每个文章每一行都原封不动的储存起来,这需要一个数组,然后我们需要一个集合数组,每个文章里面的单词放到一个集合里面,然后我们还需要一个数组,用来存放每篇文章整理过后的每一行,整理的方法是,把所有的单词化成小写,然后后面加一个空格,拼成一个字符串,字符串的前面再加一个空格,这样我们想要查某个单词的时候就查前后加了空格的单词,因为不加空格,直接拿着原文那种去查,会因为单词包含单词的问题出错,然后其余的就比较简单了,然后如果查询没有查到东西要特殊输出。......

m0_73035684的博客 228

iOS自动化之打包-xcodebuild命令行打包.app并安装到ios模拟器

xcode xcodebuild xcrun ios模拟器 iOS UI自动化测试 ios自动打包安装到ios模拟器

z12347891的博客 5074

UVA 1597 Searching the Web

题目链接:https://vjudge.net/problem/UVA-1597 题目翻译摘自《算法禁赛入门经典》 题目大意   输入 n 篇文章和 m 个请求(n < 100,m ≤ 50000),每个请求都是以下 4 种格式之一。 A:查找包含关键字 A 的文章。 A AND B:查找同时包含关键字 A 和 B 的文章。 A OR B:查找包含关键字 A 或 B...

weixin_30548917的博客 524

在MATLAB和Simulink中设计并仿真一个电动汽车整车动力学模型与控制系统

电动汽车(EV, Electric Vehicle)的动力学建模与控制仿真在车辆开发过程中起着至关重要的作用。通过Simulink进行整车动力学模型的构建和控制策略的验证,可以有效评估车辆性能、优化系统设计并降低开发成本。以下是如何在MATLAB和Simulink中设计并仿真一个电动汽车整车动力学模型与控制系统的详细步骤。通过上述步骤,我们成功设计并实现了基于Simulink的电动汽车整车动力学模型与控制仿真。该系统能够模拟复杂的整车动力学行为,验证控制策略的有效性,并通过优化设计提高车辆的性能和可靠性。

xiaoheshang_123的博客 549

紫书《算法竞赛入门经典》

紫书《算法竞赛入门经典》题目一览 第3章 数组和字符串(例题) UVA 272TEX Quotes UVA 10082WERTYU UVA 401Palindromes UVA 340Master-Mind Hints UVA 1583Digit Generator UVA 1584Circular Sequence 第3章 数组和字符串(习题) UVA 1585Sc...

既然弱小,就只顾变强就是了 2735

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

uva 1597 Searching the Web (wrong)

题目:Searching the Web 思路: 做了几天,还是没过,先把错误记录下: (1)每输入一个指令,在文章中查找一遍。(TLE) (2)每个单词都对应一些文章号和行号,先处理后直接查找打印。(WA) 代码: //TLE代码 #include #include #include #include #include #include #include #in

iwi 510

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

UVA - 1597 Searching the Web

/* 法一借鉴自bolg:http://blog.youkuaiyun.com/code4101/article/details/39587211 收获: 1. typedef定义数组类型,格式应为 typedef int int_array[80]; 此后int_array可作为有80个元素的int数组的简写 http://blog.youkuaiyun.com/huang_xw/artic

怕什么真理无穷?进一寸有一寸的欢喜~ 480

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

UVa1597 Searching the Web

先扯点废话

代号4101的专栏 4566

uva 1597 web 查找

Uva 1597 题目大意 输入一个 n 接下来输入 n 篇文章,每篇文章以*********结尾,接下来有 m 个单词或单词与单词直接的关系  输出每个单词存在的行。 The word “search engine” may not be strange to you. Generally speaking, a search engine searches the web pages ava...

Mr_Right_zwu的博客 525

uva-1597

#include&lt;iostream&gt; #include&lt;cstdio&gt; #include&lt;cstring&gt; #include&lt;map&gt; #include&lt;vector&gt; #include&lt;sstream&gt; using namespace std; map&lt;string,vector&lt;int&gt; &amp

sxy201658506207的博客 367

UVA ~ 1597 ~ Searching the Web (模拟,map+bitset)

题意:输入n篇文章和m个请求(n 1.A:查找包含关键字A的文章。(即如果某篇文章中含有A,输出含有A的行) 2.A AND B:查找同时包含关键字A和B的文章。(即如果某篇文章中含有A和B,输出含有A的行,或含有B的行) 3.A OR B:查找包含关键字A或B的文章。(即如果某篇文章中含有A或B,输出含有A的行,或含有B的行) 4.NOT A:查找不包含关键字A的文章。(即如果某篇文章

张松超的博客 433

UVa 1597-Searching the Web

这个题比较长,如果按照题目要求一步一步做的话。也不是很难。但是如果想提高代码精简度和可读性高效性确实不容易,想轻松AC还是用C++,C语言的输入输出。Java很容易超时。普通算法要10s左右。 Java代码 : import java.util.*; public class Main1597 { public static void main(String[] args) { ...

weixin_33906657的博客 185

UVa:1597 - Searching the Web

题目思路:首先需要构造出关键词的字典,提取关键字有一个小技巧:可以把字符串中所有非英文字母化为空格,然后用stringstream读取 void updatedic(string str,int doc_id,int row_id) { string word; for(int i=0;i<str.size();i++) { if(isalpha(str[i])) str[i

没有趟不过的河 2070

算法竞赛入门经典 第二版 习题5-10 在Web中搜索 Searching the Web uva1597

题目:https://vjudge.net/problem/UVA-1597思路:刚开始用string.find()暴力查找,然后果不其然的超时了,之后改用map过了。 用vector< string >的数组data储存原文章,每个数组元素存储一篇文章,又用了一个从单词到单词所在篇目和每个篇目所在行的映射,之后按要求进行查找输出即可。注:这题细节问题很多 (1)关于输出格式,题目给的PDF的输

Rewriter_huanying的博客 829

UVa 1597 - Searching the Web(模拟)

模拟网页搜索,直接遍历查找会超时,需要使用映射或指针一类的简化查找。 直接用STL写的,原本准备超时之后再用指针重写,没想到2.595s过了,就懒得改了。

wcr1996的专栏 2286

UVa 1597

超时代码送上: // UVa 1597 //#define LOCAL #include <iostream> #include <sstream> #include <cctype> // for tolower() isalpha() #include <string> #include <algorithm&gt...

weixin_30414305的博客 214
上一篇: 紫书第五章习题5-9 UVa1596-找bug
下一篇: 紫书第五章习题 5-11 UVa 12504-updating a dictionary
JXUFE_ACMer
博客等级 码龄9年 20粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值