frog is now a editor to censor so-called sensitive words (敏感詞).ios
She has a long text patom
. Her job is relatively simple -- just to find the first occurence of sensitive word wspa
and remove it.code
frog repeats over and over again. Help her do the tedious work.xml
The input consists of multiple tests. For each test:blog
The first line contains 1遞歸
string w. The second line contains 1 string pip
.rem
(1≤length of w,p≤5⋅106get
, w,p
consists of only lowercase letter)
For each test, write 1
string which denotes the censored text.
abc aaabcbc b bbb abc ab
a ab
題意: 給你一個主串,遞歸刪除模式串。
好比: T: abc S: aaabcbc
aaabcbc->aabc->a
很是巧妙的KMP,咱們用一個棧記錄當前的字符以及其在模式串匹配的位置,當位置等於模式串長度以後,將模式串長度的串出棧,從棧頂元素開始繼續匹配主串.時間複雜度 O(n).
#include <stdio.h> #include <iostream> #include <string.h> #include <stack> #include <algorithm> using namespace std; const int N = 5000005; struct Node{ char c; int k; }; char w[N],t[N],ans[N]; int Next[N]; void get_next(char *p){ int len = strlen(p); int i=0,k=-1; Next[0] = -1; while(i<len){ if(k==-1||p[i]==p[k]){ i++,k++; Next[i] = k; } else k = Next[k]; } } void Kmp(char *s,char *p){ int len1 = strlen(s),len2 = strlen(p); int i=0,j=0,len; stack <Node> stk; while(!stk.empty()) stk.pop(); while(i<len1){ if(j==-1||s[i]==p[j]){ i++,j++; stk.push(Node{s[i-1],j}); }else { j=Next[j]; } if(j==len2){ len = len2; while(!stk.empty()&&len--) stk.pop(); if(stk.empty()) j = 0; else j = stk.top().k; } } int k = 0; while(!stk.empty()){ ans[k++] = stk.top().c; stk.pop(); } for(int i=k-1;i>=0;i--) printf("%c",ans[i]); printf("\n"); } int main(){ while(scanf("%s%s",w,t)!=EOF){ get_next(w); Kmp(t,w); } return 0; }