LibreOJ #103. 子串查找

二次联通门 : LibreOJ #103. 子串查找

/*
    LibreOJ #103. 子串查找

    kmp

*/
#include <cstdlib>
#include <cstring>
#include <cstdio>

#define Max 1000900

int next[Max];

void Get_Next (char *line)
{
    next[0] = -1;

    for (register int pos_1 = 0, pos_2 = -1, Len = strlen (line); pos_1 < Len; )
        if (pos_2 == -1 || line[pos_1] == line[pos_2])
        {
            pos_1 ++;
            pos_2 ++;
            next[pos_1] = pos_2;
        }
        else
            pos_2 = next[pos_2];

}

int Answer;

void Kmp (char *line, char *__txt)
{
    int Len_txt = strlen (__txt);
    int Len_ = strlen (line);

    if (Len_txt < Len_)
    {
        puts (0);
        exit (0);
    }
    for (register int pos_1 = 0, pos_2 = 0; pos_2 < Len_txt && pos_1 < Len_; )
    {
        if (pos_1 == -1 || line[pos_1] == __txt[pos_2])
        {
            pos_1 ++;
            pos_2 ++;
        }
        else
            pos_1 = next[pos_1];
        if (pos_1 == Len_)
        {
            Answer ++;
            pos_1 = next[pos_1];
        }
    }
}

char line[Max];
char __txt[Max];

int main (int argc, char *argv[])
{
    scanf ("%s", __txt);
    scanf ("%s", line);

    Get_Next (line);

    Kmp (line, __txt);
    printf ("%d", Answer);

    return 0;
}
时间: 2024-11-09 22:55:15

LibreOJ #103. 子串查找的相关文章

#103. 子串查找

内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 这是一道模板题. 给定一个字符串 A AA 和一个字符串 B BB,求 B BB 在 A AA 中的出现次数. A AA 中不同位置出现的 B BB 可重叠. 输入格式 输入共两行,分别是字符串 A AA 和字符串 B BB. 输出格式 输出一个整数,表示 B BB 在 A AA 中的出现次数. 样例 样例输入 zyzyzyz zyz 样例输出 3

串、串的模式匹配算法(子串查找)BF算法、KMP算法

串的定长顺序存储#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断 串的模式匹配: 串的定义:0个或多个字符组成的有限序列S = 'a1a2a3--.an ' n = 0时为空串串的顺序存储结构:字符数组,串的长度就是数组末尾'\0'前面的字符个数数组需在定义时确定长度,有局限性数组的最大长度二:串的堆分配存储表示typedef struct { char *ch; //若是非空串,则按串长分配存储区 //否则ch为空 int length; //串长度}HS

Python 的字符串类子串查找函数

Python 的字符串类有个很好用的函数,可很方便的用于与查找Python字符串类型对象子串相关的操作,具体的API如下: | find(...) | S.find(sub [,start [,end]]) -> int | | Return the lowest index in S where substring sub is found, | such that sub is contained within s[start:end]. Optional | arguments start

字符串子串查找strstr

问题: 函数名: strstr 函数原型:char *strstr(const char *str1, const char *str2); 语法:* strstr(str1,str2) str1: 被查找目标 string expression to search. str2: 要查找对象 The string expression to find. 返回值:该函数返回str2第一次在str1中的地址,如果没有找到,返回NULL 例子: charstr[]="1234xyz"; ch

一本通 字符串 Oulipo 子串查找

题目描述 这是一道模板题. 给定一个字符串 和一个字符串 ,求 B 在 A 中的出现次数.A 和 B 中的字符均为英语大写字母或小写字母. A 中不同位置出现的 B 可重叠. 输入格式 输入共两行,分别是字符串 A 和字符串 B. 输出格式 输出一个整数,表示 B 在 A 中的出现次数. 样例 样例输入 zyzyzyz zyz 样例输出 3 数据范围与提示 1 <= A,B 的长度 <= 10~6~,A.B 仅包含大小写字母. 思路 使用哈希值表示较长串的子串的值,直接比较哈希值是否相等 代码

子串查找

https://loj.ac/problem/103 题目描述 给定一个字符串A和一个字符串B,求B在A中的出现次数.A和B中的字符均为英语大写字母或小写字母. 思路 显然这是道字符串匹配题我,我们可以用KMP求解.但这里我主要想介绍一种更简单的方法:字符串Hash.我们去一个基数b,把字符串看做b进制的数.而为了尽快求出一定长度的字符串的Hash值,我们可以用滚动Hash.这一过程可以用递推完成:H(C,k+1)=H(C,k)*b + ck+1.因此我们可以求出从通过以下式子求出从k开始长n的

第46课 查找对话框的功能实现

1. 文本查找功能的核心思想 (1)获取当前光标的位置并作为起始点 (2)向后(前)查找目标第一次出现的位置 (3)通过目标位置以及目标长度在文本框中进行标记 2. QString类中提供的子串查找相关函数 (1)indexOf:从指定位置向后(即字符串末尾位置)查找目标子串的下标位置 (2)lastIndexOf:从指定位置向前(即字符串开始位置)查找目标子串的下标位置 (3)QString类中查找函数所使用的下标位置 QString text = "abcdefcdg"; QStr

字符串查找以及KMP算法

字符串查找和匹配是一个很常用的功能,比如在爬虫,邮件过滤,文本检索和处理方面经常用到.相对与C,python在字符串的查找方面有很多内置的库可以供我们使用,省去了很多代码工作量.但是我们还是需要了解一些常用的字符串查找算法的实现原理. 首先来看python内置的查找方法.查找方法有find,index,rindex,rfind方法.这里只介绍下find方法.find方法返回的是子串出现的首位置.比如下面的这个,返回的是abc在str中的首位置也就是3.如果没找到将会返回-1 str = "dkj

String方法

构造函数: String() String(char[] chars) String(String strObj) String(byte asciiChars[]) 整型和字符串相互转换: String到int:int i = Integer.parseInt(String s) int i = Integer.valueOf(str).intValue() int到String:String s = String.valueOf(i) String s = Integer.toString(