KMP算法(题目)

A. 子串位置

题目描述:

给定一个父字符串 s 和子字符串 p ,请按照从前向后的顺序,请求出 p 在 s 中所有出现的起始位置。

例如:s=ABADABCEABABA,p=ABA,则求解的结果是:1 9 11 。

输入:

第 1 行读入一个仅包含大写字母的字符串 s;

第 2 行读入一个仅包含大写字母的字符串 p ;

s 和 p 均是长度不超过 106 的字符串。

输出:

输出 1 行,按题意输出 p 在 s 中出现的位置,数字之间用空格隔开。

样例:

输入:

ABADABCEABABA
ABA

输出:

1 9 11

代码如下:

#include<bits/stdc++.h>
using namespace std;

const int N = 1e6 + 10;
char s[N],p[N];
//ne:存储p字符串前i个字符的最大前缀和后缀相同的长度
int ne[N];
int main(){
    scanf("%s%s",s+1,p+1);
    //计算ne数组
    ne[0] = ne[1] = 0;
    int lens = strlen(s+1),lent = strlen(p+1);
    for(int i = 1,j = 0;i < lent;i++){
        while(j && p[i+1]!=p[j+1]) j = ne[j];
        if(p[i+1] == p[j+1]) j++;
        ne[i+1] = j;
    }

    //尝试匹配父子字符串
    for(int i = 0,j = 0;i < lens;i++){
        while(j && s[i+1] != p[j+1]) j = ne[j];
        if(s[i+1] == p[j+1]) j++;
        //配对成功,输出起始位置
        if(j == lent){
            printf("%d ",i + 1 - lent + 1);
            j = ne[j];
        }
    }
    return 0;
}

B. 最多子串重复次数

题目描述:

给定若干个长度≤106 的字符串,询问每个字符串最多是由多少个相同的子字符串重复连接而成的。如:ababab 则最多有 3 个 ab 连接而成。

输入:

输入若干行(所有行的字符串的长度之和≤107),每行有一个字符串,字符串仅含英语小写字母。特别的,字符串可能为 . 即一个半角句号,此时输入结束。

输出:

对于每行输入,输出一个整数,代表计算的结果。

样例:

输入:

abcd
aaaa
ababab
.

输出:

1
4
3

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
char s[N];
int ne[N]; 
int main(){
	while(scanf("%s",s+1)&&s[1]!='.'){
		ne[0]=ne[1]=0;
		int len=strlen(s+1);
		for(int i=1,j=0;i<len;i++){
			while(j&&s[i+1]!=s[j+1]) j=ne[j];
			if(s[i+1]==s[j+1]) j++;
			ne[i+1]=j;
		}
		if(len%(len-ne[len])==0) printf("%d\n",len/(len-ne[len]));
		else printf("%d\n",1);
	}
	return 0;
}

C. 前缀和后缀

题目描述

给定若干由小写字母组成的字符串(这些字符串总长 ≤4×105 ),在每个字符串中求出所有既是前缀又是后缀的子串长度。

例如:ababcababababcabab,既是前缀又是后缀的:

ab,abab,ababcabab,ababcababababcabab 。

输入:

输入若干行,每行一个字符串。

输出:

对于每个字符串,输出一行,包含若干个递增的整数,表示所有既是前缀又是后缀的子串长度。

样例:

输入:

ababcababababcabab
aaaaa

输出:

2 4 9 18
1 2 3 4 5

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N = 4e5 + 10;
char s[N];
int ne[N];
stack<int> st;

int main(){
    while(scanf("%s",s+1) != EOF){
        //计算s字符串的next数组
        ne[0] = ne[1] = 0;
        int len = strlen(s+1);
        for(int i = 1,j = 0;i < len;i++){
            while(j && s[i+1] != s[j+1]) j = ne[j];
            if(s[i+1] == s[j+1]) j++;
            ne[i+1] = j;
        }

        //计算字符串s前缀和后缀相等的情况
        st.push(len);
        while(ne[len] != 0){
            st.push(ne[len]);
            len = ne[len];
        }

        //输出
        while(!st.empty()){
            printf("%d ",st.top());
            st.pop();
        }
        printf("\n");
    }
    return 0;
}

相关推荐

  1. KMP算法题目

    2024-06-05 22:06:03       37 阅读
  2. KMP算法

    2024-06-05 22:06:03       70 阅读
  3. KMP算法

    2024-06-05 22:06:03       57 阅读
  4. <span style='color:red;'>kmp</span><span style='color:red;'>算法</span>

    kmp算法

    2024-06-05 22:06:03      49 阅读
  5. <span style='color:red;'>KMP</span><span style='color:red;'>算法</span>

    KMP算法

    2024-06-05 22:06:03      55 阅读
  6. KMP算法

    2024-06-05 22:06:03       45 阅读
  7. <span style='color:red;'>KMP</span><span style='color:red;'>算法</span>

    KMP算法

    2024-06-05 22:06:03      63 阅读
  8. KMP算法

    2024-06-05 22:06:03       37 阅读
  9. <span style='color:red;'>kmp</span><span style='color:red;'>算法</span>

    kmp算法

    2024-06-05 22:06:03      42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-05 22:06:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-05 22:06:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-05 22:06:03       87 阅读
  4. Python语言-面向对象

    2024-06-05 22:06:03       96 阅读

热门阅读

  1. Flink窗口理论到实践

    2024-06-05 22:06:03       25 阅读
  2. Git多人协作场景的使用

    2024-06-05 22:06:03       28 阅读
  3. 数仓建模—指标体系分类分级和评价管理

    2024-06-05 22:06:03       26 阅读
  4. Linux Centos内网环境中安装mysql5.7详细安装过程

    2024-06-05 22:06:03       27 阅读
  5. Unable to parse response body for Response{requestLine=PUT

    2024-06-05 22:06:03       20 阅读
  6. jenkins快速入门

    2024-06-05 22:06:03       34 阅读
  7. Elasticsearch安装与配置:快速搭建本地环境

    2024-06-05 22:06:03       31 阅读
  8. 神经网络应用场景——语音识别

    2024-06-05 22:06:03       27 阅读
  9. 神经网络应用场景——自动驾驶

    2024-06-05 22:06:03       28 阅读
  10. 提高MongoDB效率九大优化方式

    2024-06-05 22:06:03       32 阅读
  11. git环境代码版本控制

    2024-06-05 22:06:03       33 阅读