• SCU 4438:Censor


    Censor

    frog is now a editor to censor so-called sensitive words (敏感词).

    She has a long text p

    . Her job is relatively simple -- just to find the first occurence of sensitive word w

    and remove it.

    frog repeats over and over again. Help her do the tedious work.

    Input

    The input consists of multiple tests. For each test:

    The first line contains 1

    string w. The second line contains 1 string p

    .

    (1length of w,p5106

    , 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("
    ");
    }
    int main(){
        while(scanf("%s%s",w,t)!=EOF){
            get_next(w);
            Kmp(t,w);
        }
        return 0;
    }
     
  • 相关阅读:
    树莓派常用Linux命令
    列出树莓派中系统中建立了哪些用户、哪些组?
    树莓派的用户管理
    树莓派变成一个Web服务器: nginx + php + sqlite
    树莓派做web服务器(nginx、Apache)
    树莓派修改更新源
    树莓派安装mysql
    树莓派2 购买心得
    python写的屏保程序
    win32下利用python操作printer
  • 原文地址:https://www.cnblogs.com/liyinggang/p/7403537.html
Copyright © 2020-2023  润新知