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; }
蒟蒻一只,欢迎指正