FZU 2122 ——又见LKity——————【KMP字符串匹配】
Accept: 413 Submit: 1425
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
嗨!大家好,在TempleRun中大家都认识我了吧。我是又笨又穷的猫猫LKity。很高兴这次又与各位FZU的ACMer见面了。最近见到FZU的各位ACMer都在刻苦地集训,整天在日光浴中闲得发慌的我压力山大呀!于是,我准备为诸位编写一款小工具——LKity牌文本替换(众怒,:敢不敢更土点!)。这个小工具可以帮助诸位替换代码中的变量等功能,真心是一款编程,刷题必备的神器。其功能如下:
将给定的字符序列中所有包含给定的子串替换成另外一个给定的字符串。为了让其功能更加强大,替换过程中,将忽略大小写。并且不进行递归替换操作。
不过,作为笨笨的猫猫,我是心有余而力不足呀!希望诸位ACMer能帮我实现哈。(众FZU的ACMer:”……”);
Input
Output
Sample Input
Sample Output
Source
福州大学第十届程序设计竞赛
解题思路:判断字符相等的地方处理一下。再者就是当匹配失败时候要回退j指针,回退j时要把txt前面已经失效的一段字符输出来,比如前面匹配上k个字符,这次回退后只能匹配上j个字符,那么就要把前面失效的k-j个字符输出来。
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<string>
using namespace std;
const int maxn = 1e5+200;
char p[1020],txt[maxn],rpl[1020];
int lenp, lenr, lent, fail[1020];
bool jud(char a, char b){
if(a == b){
return true;
}else{
if(a>='a'&&a<='z'){
if(b>='A'&&b<='Z'){
if(a-32 == b)
return true;
}
}
if(a>='A'&&a<='Z'){
if(b>='a'&&b<='z'){
if(a+32 == b)
return true;
}
}
}
return false;
}
void getfail(){
fail[0] = fail[1] = 0;
int i, j;
for(i = 1; i < lenp; i++){
j = fail[i];
while(j && (!jud(p[i],p[j]))) j = fail[j];
fail[i+1] = jud(p[i],p[j]) ? j+1:0;
}
}
void kmp(){
int i, j = 0, k;
for(int i = 0; i < lent; i++){
if(!jud(txt[i],p[j])){
k = j;
}
while(!jud(txt[i],p[j])){
if(j){
j = fail[j];
}
else break;
for(int kk = i-k; kk < i-k+k-j; kk++){
printf("%c",txt[kk]);
}
k = j;
}
if(jud(p[j],txt[i])) j++;
else{
printf("%c",txt[i]);
}
if(j == lenp){
for(k = 0; k < lenr; k++){
printf("%c",rpl[k]);
j = 0;
}
}
}
for(k = lent-j; k < lent; k++){
printf("%c",txt[k]);
}puts("");
}
int main(){
while(gets(p)!=NULL){
gets(rpl);
gets(txt);
lenp = strlen(p);
lenr = strlen(rpl);
lent = strlen(txt);
getfail();
kmp();
}
return 0;
} /*
ababd
kk
ababcd aab
kk
AAAB aab
kk
abaa */
FZU 2122 ——又见LKity——————【KMP字符串匹配】的更多相关文章
- FZU 2122——又见LKity——————【字符串匹配、暴力】
Problem 2122 又见LKity Accept: 407 Submit: 1413Time Limit: 1000 mSec Memory Limit : 32768 KB Pr ...
- FZU 2122 又见LKity【字符串/正难则反/KMP/把一个字符串中某个部分替换为另一个部分】
嗨!大家好,在TempleRun中大家都认识我了吧.我是又笨又穷的猫猫LKity.很高兴这次又与各位FZU的ACMer见面了.最近见到FZU的各位ACMer都在刻苦地集训,整天在日光浴中闲得发慌的我压 ...
- FZU 2122 又见LKity(KMP+返回所有匹配位置)
基础kmp应用,找到所有匹配位置即可 #include<stdio.h> #include<string.h> #include<algorithm> #inclu ...
- FZU 2122 又见LKity
直接模拟或者KMP #include <iostream> #include <string.h> #include <stdio.h> #include < ...
- KMP字符串匹配 模板 洛谷 P3375
KMP字符串匹配 模板 洛谷 P3375 题意 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.(如果 ...
- {Reship}{KMP字符串匹配}
关于KMP字符串匹配的介绍和归纳,作者的思路非常清晰,推荐看一下 http://blog.csdn.net/v_july_v/article/details/7041827
- 洛谷P3375 - 【模板】KMP字符串匹配
原题链接 Description 模板题啦~ Code //[模板]KMP字符串匹配 #include <cstdio> #include <cstring> int cons ...
- Luogu 3375 【模板】KMP字符串匹配(KMP算法)
Luogu 3375 [模板]KMP字符串匹配(KMP算法) Description 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来 ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
随机推荐
- C# 判断一个数是不是奇数/偶数
一般普通版: private bool IsOdd(int num) { ) == ; } 通过判断取余 现在升级版: private bool IsOdd(int num) { ) == ; } 通 ...
- githup上传文件
GitHub是基于git实现的代码托管.git是目前最好用的版本控制系统了,非常受欢迎,比之svn更好. GitHub可以免费使用,并且快速稳定.即使是付费帐户,每个月不超过10美刀的费用也非常便宜. ...
- Lua入门(一)
嵌入式语言 作为一门扩展式语言,Lua 没有 "main" 程序的概念: 它只能 嵌入 一个宿主程序中工作, 该宿主程序被称为 被嵌入程序 或者简称 宿主 . 宿主程序可以调用函数 ...
- 二、搭建SpringBoot项目
与其说是搭建,还不如说去下载...(注意,在此之前要确保你的3000块钱的笔记本上安装了JDK8+已经最新的相对较新的maven:apache-maven-3.6.0,至于JDK以及maven的相关安 ...
- 微信小程序设计稿pt怎么转rpx
什么是逻辑分辨率? 什么是物理分辨率? 什么是DPI?(Dots Per Inch) 最早的时候,这个单位是用来描述打印机的性能的,意思是每英寸能打多少个墨点,毫无疑问,DPI越高,打印出来的东西就会 ...
- python爬取淘宝排名
import timeimport jsonimport requestsimport xlrdimport randomimport os from xlutils.copy import copy ...
- NetworkX初相识
听说NetworkX是一个很牛的复杂网络研究的工具,就来试一下吧. import networkx as nx G= nx.Graph()#建立一个空白的图 G.add_node("node ...
- 【BZOJ1047】[HAOI2007]理想的正方形 (倍增ST表)
[HAOI2007]理想的正方形 题目描述 有一个\(a*b\)的整数组成的矩阵,现请你从中找出一个\(n*n\)的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: ...
- python之函数(二)
上一篇中我们在函数体中的写的都是打印语句,用print来输出打印结果.但是在实际使用的时候,我们并不需要将结果输出在控制台上.这时候该如何解决呢? 1. return返回值. 我们可以将函数的结果通过 ...
- C. Connect Three Round #528 (Div. 2)【曼哈顿距离】
一.题面 题目链接 二.分析 这题的关键是要确定一个点是从三个点出发的交汇点,其他的只要结合曼哈顿距离的定义即可明白.因为是三个点,这个交汇点的坐标分别对应的就是x,y值的中值.然后一个小技巧就是曼哈 ...