FZU2122_又见LKity
2024-09-19 08:00:00
题目是说给你一个替换串和目标串。把一个长串中的所有的替换串替换为目标串而且不递归地替换。
很简单,直接做一次KMP然后直接替换。
注意替换后跳到替换串的尾部。
注意大小写的问题。
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 50550
using namespace std; char s0[],s1[],s[maxn];
int f[],L;
bool tag[maxn];
int n,m; bool equal(char c1,char c2)
{
if (c1==c2) return true;
if (c1>c2) swap(c1,c2);
c1=c1-'A'+'a';
if (c1==c2) return true;
return false;
} void getfail()
{
memset(f,,sizeof f);
f[]=;
for (int i=; s0[i]; i++)
{
int k=f[i-];
while (k && equal(s0[k+],s0[i])==false) k=f[k];
if (equal(s0[k+],s0[i])) f[i]=k+;
else f[i]=;
}
} void trans(char ss[])
{
for (int i=; ss[i]; i++)
{
if (ss[i]>='A' && ss[i]<='Z') ss[i]=ss[i]-'A'+'a';
}
} int main()
{
while (gets(s0+))
{
gets(s1+),gets(s+);
getfail();
L=strlen(s0+);
memset(tag,false,sizeof tag);
int cur=;
for (int i=; s[i]; i++)
{
if (equal(s0[cur+],s[i])) cur++;
else
{
int k=f[cur];
while (k && equal(s0[k+],s[i])==false) k=f[k];
if (equal(s0[k+],s[i])) cur=k+;
else cur=;
}
if (cur==L)
{
tag[i]=true;
cur=;
}
}
for (int i=; s[i]; i++)
{
if (tag[i+L-]==true)
{
printf("%s",s1+);
i=i+L-;
}
else printf("%c",s[i]);
}
printf("\n");
}
return ;
}
最新文章
- ASP.net MVC 学习笔记(一)-一些不同点
- Python3基础 访问列表 大于等于指定索引值的所有元素
- Linux中exit与_exit的区别
- Java Eclipse进行断点调试
- MVC 使用HandleErrorAttribute统一处理异常
- 各种demo——CI框架学习
- IndexedDB
- Asp.Net异常:";由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值";的解决方法
- 50个必备的实用jQuery代码段+ 可以直接拿来用的15个jQuery代码片段
- Android:ListViewAdapter
- 简单类型对象 String
- 小程序swiper 滑块视图容器
- Dubbo 入门学习笔记
- 【XShell】xshell评估过期解决办法
- php5.6.11编译安装报错configure: error: Don&#39;t know how to define struct flock on this system
- 在Linux终端安装Julia
- linux driver ------ platform模型,通过杂项设备(主设备号是10)注册设备节点
- 2018.10.26 NOIP模拟 瓶子 (dp/贪心)
- C#程序如何捕捉未try/catch的异常——不弹“XXX已停止工作”报错框
- Maven实战——Gradle,构建工具的未来?