紫书第五章习题 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;  
    }  

ISCE2+MintPy环境搭建实战:用Anaconda五分钟搞定InSAR处理全家桶 本文提供了一份详细的ISCE2+MintPy环境安装教程,旨在帮助InSAR处理初学者快速搭建开发环境。通过使用Anaconda创建虚拟环境并配置国内镜像,用户可在五分钟内一键安装ISCE2和MintPy全家桶,有效解决依赖冲突和版本兼容性问题,让用户能专注于数据处理本身。 阅读详情

相关推荐

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(四)-无人机系统(UAS)命令与控制(C2)通信用例

UTM向5G网络提供无人机系统C2通信所需的信息,例如服务类别、无人机系统服务的流量类型、授权的无人机系统服务所需的QoS以及无人机系统服务的订阅。遵循模型B的网络辅助C2模型,为了确保UAS操作的C2通信的服务可用性和可靠性,特别是当无人机在操作员的视线之外(BLOS)飞行时,为无人机提供支持冗余的C2通信链路。如果需要创建额外的C2通信连接或更改现有数据连接的配置以进行C2通信,则5G网络会根据无人机系统的授权服务信息和C2通信中所需的QoS和优先级,修改或分配一个或多个C2通信流量的QoS流。

u011376987的博客 2051

习题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

机器视觉最全面试题总结

空洞卷积(Atrous Convolution)也叫做膨胀卷积、扩张卷积,最初的提出是为了解决图像分割在用下采样(池化、卷积)增加感受野时带来的特征图缩小,后再上采样回去时造成的精度上的损失。空洞卷积通过引入了一个扩张率的超参数,该参数定义了卷积核处理数据时各值的间距。可以在增加感受野的同时保持特征图的尺寸不变,从而代替下采样和上采样a. 是普通的卷积过程(dilation rate = 1),卷积后的感受野为3b. 是dilation rate = 2的空洞卷积,卷积后的感受野为5。

@bangbang的博客 9209

习题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

群晖NAS下docker安装MySql

本文将一步一步讲解如何在群晖NAS的docker中启用一个MySQL容器 , 算是初学者对问题解决的一个记录.

qq_46375248的博客 5977

S7-1200 PLC PID功能 | 调节PID参数

S7-1200 PLC PID功能 | 调节PID参数

Robot_PLC_HMI_Automation 1万+

习题5-10 在Web中搜索 UVa1597

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

Skyline 1897

【图像拼接】论文精读:Content-Preserving Warps for 3D Video Stabilization(CPW)

论文题目:Content-Preserving Warps for 3D Video Stabilization——用于3D视频稳定的内容保持扭曲GSP、SPW、LPC等warp时多个项最小化问题的思想都是来自于这篇论文——CPW视频防抖。我们描述了一种从手持摄像机转换视频的技术,以便它看起来像是用定向相机运动拍摄的。我们的方法调整视频以出现,就好像它是从附近的视点拍摄的,允许模拟 3D 相机运动。通过仅针对感知合理性,而不是准确的重建,我们能够开发能够有效从单个源视频中重建动态场景的算法。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 2万+

UVA1597 在Web中搜索 Searching the Web

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

m0_73035684的博客 228

31、工程中不确定性量化与优化的全面解析

本文全面解析了工程中不确定性量化与优化的关键方法。针对数据充足与不足两种情况,分别介绍了概率理论和非概率方法在不确定性建模中的应用;系统阐述了采样方法、FORM/SORM、泰勒级数近似等不确定性传播技术;深入比较了RBDO与RDO两种主流优化框架的原理、步骤及适用场景,并通过两杆桁架案例展示了具体实现过程。文章旨在为工程师提供一套完整的从不确定性分析到优化设计的方法论,提升工程系统的可靠性与稳健性。

php55的博客 121

【Java核心高阶进阶】44-Java8核心新特性

模块十:Java新特性演进 · 第 1 篇Java 8 是 Java 语言历史上最重要的一次发布,它引入的函数式编程范式从根本上改变了 Java 的编码方式。即便到了 JDK 21 的今天,Lambda、Stream、Optional 仍是日常开发的高频工具。本篇将深入这些特性的语法、原理与底层机制,帮助你不仅会用,更知其所以然。

gaochufukanyongren的博客 24

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

Python爬虫教程:抓取地方政府网站的公开文件与政策信息

Web爬虫是指一种自动化脚本,用于模拟人类浏览器访问网页、提取网页内容的数据抓取工具。发送请求到目标网页;获取网页内容;解析网页内容,提取所需数据;将数据保存或进一步处理。爬虫可以抓取各种形式的数据,如文本、图片、文件等。本教程将重点展示如何抓取地方政府网站上公开的政策文件、公告等信息。许多政府网站都会采取一定的反爬虫措施,防止大量数据被爬取。IP封锁:如果短时间内大量请求来自同一IP,可能会被封锁。验证码:一些网站会使用验证码来验证访问者是否为机器人。动态加载。

2201_76125261的博客 1981

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

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

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

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

uva 1597 Searching the Web (wrong)

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

iwi 510

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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、付费专栏及课程。

余额充值