Method
- 显然题意是求 在s串中 将所有a串替换成c串,同时s,a,b串的长度均<=1e^6, 暴力求解很可能会TLE;
- 自然就想到KMP算法,找出a串的next数组,然后对s串进行匹配,将完全匹配处的首字符的下标用map进行维护,最后得到一个存有s串中所有完全匹配a串的位置的map;
- 输出时如果当前位置的map值为1,则输出b串,同时将指针后移|a|位,最终全部输出;
Code
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize(2)
#define ll long long
const int Max = 1e6+3;
const int mod = 1e9+7;
template<typename T> T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }
char s[Max], a[Max], b[Max];
int slen, alen, blen, next[Max];
map<int, int> mp;
void GetNext()
{
next[0]=-1;
int k=-1;
int j=0;
while(j<=alen-1){
if(k==-1||a[j]==a[k]){
k++;
j++;
next[j]=k;
}
else k=next[k];
}
}
void FindStr()
{
int i=0,j=0;
while(i<slen)
{
if(j==-1||s[i]==a[j])
{
if(j==alen-1)
{
mp[i-j] = 1;
j=next[j];
}
j++;
i++;
}else j=next[j];
}
}
int main()
{
scanf("%s%s%s", s, a, b);
slen = strlen(s);
alen = strlen(a);
blen = strlen(b);
GetNext();
FindStr();
for(int i=0; i<slen; i++)
{
if(mp[i]) {
for(int j=0; j<blen; j++)
printf("%c", b[j]);
i = i + alen - 1;
}
else printf("%c", s[i]);
}
return 0;
}蒟蒻一只,欢迎指正

京公网安备 11010502036488号