5-5 E. 可重叠子串 (Ver. I)

2024-02-02 23:52
文章标签 子串 重叠 ver

本文主要是介绍5-5 E. 可重叠子串 (Ver. I),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

给定一个字符串(模式串)和一些待查找的字符串,求每个待查找字符串在模式串中出现的次数(可重叠)

输入

第一行输入t,表示有t组测试数据

每一组测试数据包含多行:

每一组的第一行包括一个字符串P,长度不超过105,且非空串

每一组的第二行包括一个整数N,代表待查找的字符串数量 (1 <= N <= 5)

每一组接下来的N行,每一行包括一个待查找的字符串,其长度不超过50,且非空串

输入样例:

2
aabbcc
3
aa
bb
cc
ababab
1
aba

输出

对于每组测试数据,

输出每个待查找字符串出现的次数,

具体输出见样例

输出样例:

aa:1
bb:1
cc:1
aba:2

代码 

#include <iostream>
using namespace std;class FindStr{
public:string P,S;int N,Slen,res;int *next;FindStr(){cin >> P;cin >> N;while(N--){cin >> S;Slen = S.length();next = new int[Slen];getNext();res = MethKPM();cout << S << ":" << res << endl;}}void getNext(){next[0] = -1;int i=0,j=-1;while(i < Slen){if(j == -1 || S[i] == S[j]){i++;j++;next[i] = j;}else{j = next[j];}}}int MethKPM(){  //对KPM算法进行变化int count=0,i=0,j=0;while(i < P.length() && j < Slen){if(j == -1 || P[i] == S[j]){i++;j++;}else{j = next[j];}if(j >= Slen){  //当发现模式串与主串相同时count++;i -= Slen-1;  //i退回到原本返回值的后一位,继续找有无相同部分,直至遍历完主串j = 0;}}return count;}
};int main()
{int t;cin >> t;while(t--){FindStr key;}return 0;
}

这篇关于5-5 E. 可重叠子串 (Ver. I)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/672391

相关文章

poj2406(连续重复子串)

题意:判断串s是不是str^n,求str的最大长度。 解题思路:kmp可解,后缀数组的倍增算法超时。next[i]表示在第i位匹配失败后,自动跳转到next[i],所以1到next[n]这个串 等于 n-next[n]+1到n这个串。 代码如下; #include<iostream>#include<algorithm>#include<stdio.h>#include<math.

poj3261(可重复k次的最长子串)

题意:可重复k次的最长子串 解题思路:求所有区间[x,x+k-1]中的最小值的最大值。求sa时间复杂度Nlog(N),求最值时间复杂度N*N,但实际复杂度很低。题目数据也比较水,不然估计过不了。 代码入下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring

spoj705( 求不相同的子串个数)

题意:求串s的不同子串的个数 解题思路:任何子串都是某个后缀的前缀,对n个后缀排序,求某个后缀的前缀的个数,减去height[i](第i个后缀与第i-1 个后缀有相同的height[i]个前缀)。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstrin

PHP最长单一子串

<?php//方法一$s='abcccddddddcdefg';$max='';while($s!=''){$i=0; while($i<strlen($s) && $s[$i]==$s[0]) $i++;if ($i>strlen($max)){$max=substr($s,0,$i);} $s=substr($s,$i);}echo $m

【UVA】10066-The Twin Towers(最长公共子串问题)

赤裸裸的最长公共子串问题,没什么好说的,注意的是,每组数据后面都有一个空行。 13996019 10066 The Twin Towers Accepted C++ 0.015 2014-08-06 00:34:53 #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using

MySQL中的`SUBSTRING()`和`MID()`函数:精准抽取字符串中的子串

在数据库操作中,经常需要从存储的字符串中提取出特定的部分,比如从用户全名中提取姓氏、从日期字符串中提取年份等。MySQL提供了SUBSTRING()和MID()两个函数,它们的功能几乎完全相同,都是用来从字符串中抽取子串的。本文将详细介绍这两个函数的用法、参数以及在实际场景中的应用。 一、SUBSTRING()和MID()函数的基本语法 1. SUBSTRING()函数 SUBSTRING(

【代码随想录|贪心part04以后——重叠区间】

代代码随想录|贪心part04以后——重叠区间 一、part041、452.用最少数量的箭引爆气球2、435. 无重叠区间2、763.划分字母区间3、56. 合并区间4、738.单调递增的数字 总结 python 一、part04 1、452.用最少数量的箭引爆气球 452. 用最少数量的箭引爆气球 class Solution:def findMinArrowShot

SQL进阶技巧:每年在校人数统计 | 区间重叠问题

目录 0 问题分析 1 数据准备 2 问题分析 3 小结 区间重叠问题 0 问题分析  有一个录取学生人数表 in_school_stu,记录的是每年录取学生的人数及录取学生的学制,计算每年在校学生人数。 1 数据准备 create table in_school_stu as(select stack(5,1,2001,2,1200,2,2000,5,1300,

leetcode: 5. 最长回文子串

5. 最长回文子串 题目链接https://leetcode.cn/problems/longest-palindromic-substring/ 题目描述 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。 示例 2:

WSA重叠IO

服务端: #include <iostream>#include <WinSock2.h>#pragma comment(lib,"ws2_32.lib")#include <Windows.h>#define PORT 6000#define IP_ADDRESS "127.0.0.1"#define MSGSIZE 1024class PerSocketData{pub