SCU 4438:Censor

Censor

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

Input

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

(1length of w,p5106get

, w,p

consists of only lowercase letter)

Output

For each test, write 1

string which denotes the censored text.

Sample Input

abc
    aaabcbc
    b
    bbb
    abc
    ab

Sample Output

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;
}
相關文章
相關標籤/搜索