B - 又见LKity(kmp)

2024-06-09 05:18
文章标签 kmp lkity

本文主要是介绍B - 又见LKity(kmp),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 Problem Description

嗨!大家好,在TempleRun中大家都认识我了吧。我是又笨又穷的猫猫LKity。很高兴这次又与各位FZU的ACMer见面了。最近见到FZU的各位ACMer都在刻苦地集训,整天在日光浴中闲得发慌的我压力山大呀!于是,我准备为诸位编写一款小工具——LKity牌文本替换(众怒,:敢不敢更土点!)。这个小工具可以帮助诸位替换代码中的变量等功能,真心是一款编程,刷题必备的神器。其功能如下:

将给定的字符序列中所有包含给定的子串替换成另外一个给定的字符串。为了让其功能更加强大,替换过程中,将忽略大小写。并且不进行递归替换操作。

不过,作为笨笨的猫猫,我是心有余而力不足呀!希望诸位ACMer能帮我实现哈。(众FZU的ACMer:”……”);

 Input

输入包含多组数据。 输入为标准输入,输入包含3行。 第一行为需要查找的字符串S1。S1仅由大写或者小写字母组成,且其长度在区间[1,,100]内。 第二行为要替换的字符串S2。S2由[32,125]的字符组成,且其长度在区间[1,100]内。 第三行为原始字符串S,S由[32,125]的字符组成。且其长度在区间[1,50,000]内。

 Output

对于每组数据,请输出替换后的字符串。

 Sample Input

abc
bc ab
aaa aaabca 333Abcc##

 Sample Output

aaa aabc aba 333bc abc##

#include <iostream>
#include <cstring>
#include <stdio.h>
#define M 150008
using namespace std;
int v[M];
void getnext(char *s1,int *next)
{
int m=strlen(s1);
next[0]=next[1]=0;
for(int i=1;i<m;i++)
{
int j=next[i];
while(j&&s1[i]!=s1[j])
j=next[j];
if(s1[i]==s1[j])
next[i+1]=j+1;
else
next[i+1]=0;
}
}
int kmp(char *s3,char *s1,int *next)
{
int n=strlen(s3);
int m=strlen(s1);
getnext(s1,next);
int j=0;
for(int i=0;i<n;i++)
{
while(j&&s1[j]!=s3[i])
j=next[j];
if(s1[j]==s3[i])
++j;
if(j==m)
v[i-m+1]=1;
}
}
int main()
{
char s1[M],s2[M],s3[M],s4[M];
int next[M];
while(~scanf("%[^\n] %[^\n] %[^\n] ",s1,s2,s3))
{ 
memset(v,0,sizeof(v));
int m=strlen(s1);
int n=strlen(s3);
strcpy(s4,s3);
for(int i=0;i<m;i++)
{
if(s1[i]>='A'&&s1[i]<='Z')
s1[i]+='a'-'A';
}
for(int i=0;i<n;i++)
{
if(s4[i]>='A'&&s4[i]<='Z')
s4[i]+='a'-'A';
}
kmp(s4,s1,next);
for(int i=0;i<n;i++)
{
if(v[i])
{     
cout<<s2;
i+=m-1;
} 
else
cout<<s3[i];
}
cout<<endl;
}
return 0;
}

这篇关于B - 又见LKity(kmp)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

字符串的特征向量与KMP算法

字符串的特征向量就是由字符串各位置上的特征数构成的一个向量。设字符串为P,令Pi为从字符串首字母到第i个位置的前缀,则字符串P的i位置上的特征数就是Pi的首尾非空真子串匹配的最大长度。例如:字符串abcdaabcab的特征向量是(0,0,0,0,1,1,2,3,1,2)。其中第5个位置的特征数是1,因为P5是abcdaa,首尾非空真子串能够匹配的就是a;而第7个位置的特征数是3,因为P7是abcd

KMP算法:字符串匹配问题

1,暴力匹配算法 1.1,基本介绍 暴力匹配算法是对字符串及匹配子串的字符进行一一匹配,完全匹配后则说明字符串匹配假设存在字符串str和子串childStr,需要进行字符串的暴力匹配,才从头开始匹配此时取字符串str的索引位置i = 0,子串childStr的索引位置j = 0,用str[0]和childStr[0]进行比较,如果匹配,则进行i++, j++,并依次进行下一个字符匹配此时如果不

使用KMP算法实现对于指定两个字符之间的字符串分割方法

import java.util.ArrayList;public class UsingKMPAlgorithmSpiltString {public static void main(String[] args) {//待分割的文本String text = "【分割符号】劳力士【分割符号】浪琴【分割符号】欧米茄【分割符号】宝珀【分割符号】百达翡丽" ;//分割符号字符串String patt

从KMP原理原理出发解决问题

网上已经很多对具体过程的解释 我就不再赘述 这里 我只说一下 我对KMP算法的理解 ps:刚开始 也是想了好久 但是始终不得其解 后来 看了算法导论 然后想了想 就明白了 KMP算法原理 前提:next数组构造成功 如果匹配到pos位置匹配失败 那么在模式串中的匹配位置回跳到patten[0…pos-1]这个串的公共前后缀的下一个位置 这样就节省了匹配前缀的时间 KMP优化思想就在这里

非常容易理解的KMP字符串匹配算法转载过来记录一下

https://www.cnblogs.com/maybe2030/p/4633153.html 写的非常明白,留个记录,需要的可以直接进去看 代码记录,getNext就是算那个“部分匹配值”编码的序列,也就是该文中的这个图 查询的直接可以根据这个编码进行跳跃式的查询减少多余匹配的消耗,移动位数 = 已匹配的字符数 - 对应的部分匹配值,下面对应代码记录下“部分匹配值”的计算过程:搜索词是

字符串匹配——KMP算法中的next数组理解

关于原理就不讲了,只说下我对Next数组的理解,希望可以让你获得灵光一闪。 其实最难的就是是j=Next[j];这么一句话,当时思考了很长时间,终于明白的时候确实很兴奋加得意。 #include<cstdio>#include<cstring>void getNext(int *Next,char* src){int i,j;Next[0]=-1;i=0;j=-1;int N=strl

2024.6.14刷题记录-KMP记录

目录 一、831. KMP字符串 - AcWing题库 1.普通版KMP 2.代码简洁版KMP 一、831. KMP字符串 - AcWing题库 1.普通版KMP 学习记录(http://t.csdnimg.cn/JxPv5)。解题代码如下: # KMP算法# 创建next数组def build_next(patt):i = 1n = len(patt)prefix_

HDU 3613 Best Reward 正反两次扩展KMP

题目来源:HDU 3613 Best Reward 题意:每个字母对应一个权值 将给你的字符串分成两部分 如果一部分是回文 这部分的值就是每个字母的权值之和 求一种分法使得2部分的和最大 思路:考虑扩展KMP 输出a串 得到a的反串b 求出f[0]和f[1] 和 extend[0]和extend[1] 正反求2次 枚举位置i 分成2部分0到i-1 和i到n-1 因为分成的2部分必须组成原字符

HDU 4333 Revolving Digits 扩展KMP

题目来源:HDU 4333 Revolving Digits 题意:求一个数字循环移动后有多少个不同的小于 等于 大于的数字 思路:扩展KMP求出S[i..j]等于S[0..j-i]的最长前缀 判断 next[i] 大于等于n就是相同 小于n判断S[next[i]]和S[next[i]+i]的大小 next数组的含义就是S字符串以i开始的和S本身(以0开始)的最长公共前缀 把题目输入的复制一

HDU 5442 Favorite Donut 最大表示法+KMP

首先2次最大表示法求出顺序和逆序情况下的位置,不过逆序求出来的是最大的下标,可以利用循环节来推出最小的位置。 #include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 1000010;int f[maxn];char s[maxn];void getFail