字符串查找(二分和快排的运用)

Description

现在给你一个字典,再给出几个字符串,让你查找,这些字符串是否在其中。

Input

第一行是两个整数M,N分别表示字典数和字符串数。

第2至第M+1行,每一行是一个字典。

第M+2至第M+2+N行是徐查找的字符串。

(n<=10,0000, m<=20,0000, 字符串长度不超过10,且均为小写字母)

Output

共N行,每行表示第i个字符串在不在字典中,用0表示不在,1表示在。

Sample Input

5 3

acc

cat

multiply

do

will

accept

cat

a

Sample Output

0

1

0

解题思路:

拿到该题,第一个想法就是把每个待查找单词一一跟字典里的单词比较,但是一看数据,n<=10,0000, m<=20,0000,数据这么大,如果一一比较肯定会超时,再看看AC人数,果然不多,看来题目并没有预想的那么容易,得用一些之前学的算法来解题了。回想一下,能够提高查找效率的,二分是最为熟知的,所以我打算用二分来做该题。既然要用二分,就必须得让字典中的单词按照字典序排序。效率高的无非就是快排sort函数了。想到这里,整道题也就迎刃而解了,就是一道先排序后二分的基础题罢了。但是我用G++提交的时候竟然是RE,之后改用C++提交便AC了,这点很不理解,希望哪位大牛能为我解答一下。

AC代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#define MAX_NUM 100005
using namespace std;

string dic_1[MAX_NUM * 2], word_1[MAX_NUM * 2];

bool cmp(string a, string b)    // 定义一个比较函数,使其按字典序排序
{
    if(a.compare(b) <= 0)
        return true;
    else
        return false;
}

int main()
{
    int M, N;
    char dic_2[15], word_2[15];
    scanf("%d%d", &M, &N);
    for(int i = 0; i < M; i++)
    {
        scanf("%s", dic_2);
        dic_1[i] = dic_2;     // scanf输入效率要高于cin,所以我用scanf输入字符串,再赋值给string
    }
    for(int i = 0; i < N; i++)
    {
        scanf("%s", word_2);
        word_1[i] = word_2;
    }
    sort(dic_1, dic_1 + M, cmp);  // 进行排序

    for(int i = 0; i < N; i++)
    {
        int low = 0, high = M-1, mid;
        bool isFind = false;
        while(low <= high)     // 二分查找
        {
            mid = (low + high) / 2;
            if(word_1[i].compare(dic_1[mid]) == 0)
            {
                printf("1\n");   // 找到则输出1
        	       isFind = true;        //确定已经找到
                break;
            }
            if(word_1[i].compare(dic_1[mid]) > 0)
                low = mid + 1;
            if(word_1[i].compare(dic_1[mid]) < 0)
                high = mid - 1;
        }
        if(!isFind)
            printf("0\n");  // 找不到输出0
    }
    return 0;
}

字符串查找(二分和快排的运用),布布扣,bubuko.com

时间: 2024-10-03 02:44:27

字符串查找(二分和快排的运用)的相关文章

poj 2804 词典 (字典树 或者 快排+二分)

2804:词典 总时间限制:  3000ms  内存限制:  65536kB 描述 你旅游到了一个国外的城市.那里的人们说的外国语言你不能理解.不过幸运的是,你有一本词典可以帮助你. 输入 首先输入一个词典,词典中包含不超过100000个词条,每个词条占据一行.每一个词条包括一个英文单词和一个外语单词,两个单词之间用一个空格隔开.而且在词典中不会有某个外语单词出现超过两次.词典之后是一个空行,然后给出一个由外语单词组成的文档,文档不超过100000行,而且每行只包括一个外语单词.输入中出现单词只

hdu--4022--multimap&lt;别人用快排+二分,没学好&gt;

本来 我是想直接开2个计数数组 存下 行 列各自的元素个数的.. 可是 数据达到了 10^9 但是数据个数 只有10^5 虽然可以考虑用 离散化...但我想先map试下 毕竟 离散化烦~ 关于multimap的使用 和map还是有点差别的..但是 我们单纯地只是使用 stl中的函数的话 还是不存在什么难度吧 听说 <<STL源码剖析>>不错...可是 不太适合初学者~ =_=   大师 经典.. 我这题的wa错误 太难找了 厌死.... 我因为一开始想使用数组的原因  多此一举地

单链表的排序(快排和冒泡实现)以及查找中间结点

//快排,冒泡链表排序 #include<iostream> #include<assert.h> using namespace std; template<class T> struct LinkNode { T _data; LinkNode* _next; LinkNode(const T& x) :_data(x) , _next(NULL) {} }; template<class T> class ListNode { //为了安全性

俩头查找的快排优化

对于 5743 经典快排过程: 5473 5437 会造成多次替换,所以写出优化算法: 去第一位为基准值 从左向右扫 发现大值 从右向左扫 发现小值 替换 将基准值和最后一个小值替换 function quick(arr, start, end) {     if (start >= end-1) {         return;     }     var mini = start;     var maxi = end;     var split = arr[start];     wh

普林斯顿公开课 算法3-4:快排的应用

排序的应用 排序算法有着广泛的应用. 典型的应用有 对名称进行排序 排序MP3音乐文件 显示Google的搜索结果 按标题顺序列出RSS订阅 排序之后下列问题就变得非常简单了 找出中位数 数据库中的二分查找 找出统计数据中的异常值 在邮箱中找出重复的邮件 不是特别典型的应用有 数据压缩 计算机图形 计算生物 负载平衡 编程语言中的排序算法 java中对于基本类型使用快排,对于引用类型使用归并排序.因为归并排序很稳定,而且保证复杂度为NlgN Java.C/C++中的快排都有以下特性: 对于小的子

Java常见的几种排序算法-插入、选择、冒泡、快排、堆排等

本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排序.快速排序(重点).堆排序.归并排序等等.看下图: 给定数组:int data[] = {9,2,7,19,100,97,63,208,55,78} 一.直接插入排序(内部排序.O(n2).稳定) 原理:从待排序的数中选出一个来,插入到前面的合适位置. [java] view plain copy

Java排序算法分析与实现:快排、冒泡排序、选择排序、插入排序、归并排序(二)

一.概述: 上篇博客介绍了常见简单算法:冒泡排序.选择排序和插入排序.本文介绍高级排序算法:快速排序和归并排序.在开始介绍算法之前,首先介绍高级算法所需要的基础知识:划分.递归,并顺带介绍二分查找算法. 二.划分: 划分是快速排序的前提,即把数据分为两组,大于特定值的数据在一组,小于特定值的数据在另一组.快速排序即是由划分和递归操作来完成的. (1)原理: 定义一个阈值,分别从最左面和最右面向中间遍历元素,左面找到一个大于阈值的数据便停止,右边找到一个小于阈值的数据便停止,如果此时左右两边都还没

快速排序--QuickSort,看完五分彩开奖网平台搭建自己就能写出来的快排思路推演

快速五分彩开奖网平台搭建论坛:haozbbs.com Q1446595067排序(QuickSort)介绍首先发明者竟然敢给自己发明的算法叫做QuickSort,这个名字闪不闪亮?好比别的武功叫做六脉神剑.降龙十八掌,我这个叫做"天下无敌神功".别的排序算法都是按照特点来起的,你这个不是应该叫分块递归排序法吗?或者和希尔一样,叫做霍尔排序也可以啊,这么高调是要干啥啊?我给了他一次机会,特意去查了一下,这个名字并不是江湖朋友抬爱给的,就是发明者自己起的,社会社会...不过看完这篇博客,理

常见的几种排序算法-插入、选择、冒泡、快排、堆排等

排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排序.快速排序(重点).堆排序.归并排序等等.看下图: 给定数组:int data[] = {9,2,7,19,100,97,63,208,55,78} 一.直接插入排序(内部排序.O(n2).稳定) 原理:从待排序的数中选出一个来,插入到前面的合适位置. package com.xtfggef.algo.sort; public