2015 四川省赛 C. Censor

来源:互联网 发布:淘宝号被黑了怎么变白 编辑:程序博客网 时间:2024/04/28 21:02
#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<sstream>
#include<queue>


#define ll long long
#define lll unsigned long long
#define MAX 5000009
#define MAXN 2009
#define eps 1e-8
#define INF 0x7fffffff
#define mod 1000000007
#define clr(a) memset(a,0,sizeof(a))
#define clr1(a) memset(a,-1,sizeof(a))
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1


using namespace std;


inline ll Max(ll a,ll b)
{
    return a>b?a:b;
}
inline ll Min(ll a,ll b)
{
    return a<b?a:b;
}
struct node
{
    char x;
    int pos;
};
char s[MAX];//模式串
char text[MAX];//文本串
char ans[MAX];//最后剩下的串
int Next[MAX];//失配数组


void getfail(char* s,int* f)//求失配数组
{
    int m = strlen(s);
    int j = 0,k = -1;
    Next[0] = -1;
    while(j<m)
    {
        if(k==-1||s[j]==s[k])
        {
            j++;
            k++;
            Next[j] = k;
        }
        else
            k = Next[k];
    }
}
void kmp(int m,int n)
{
    int i = 0,j = 0;
    stack<node>S;
    while(i<n)
    {
        if(j==-1||text[i]==s[j])
        {
            i++;
            j++;
            node ss;
            ss.x = text[i - 1];//已经匹配的最后一个字符
            ss.pos = j;//接下来要匹配模式串的位置
            //cout<<ss.x<<" "<<ss.pos<<endl;
            S.push(ss);//每次进去的 j 都是将要匹配的位置 !!
        }
        else
            j = Next[j];
        if(j==m)//恰好完全匹配
        {
            int tmp = m;
            while(tmp--) S.pop();//删除m个
            if(S.empty()) j = 0;//如果为空,模式串从头开始
            else j = S.top().pos;//否则将要比较模式串的第 j 个位置
        }
    }
    int num=0;
    while(!S.empty())
    {
          ans[num++]=S.top().x;
          S.pop();
    }
    for(int i=num-1;i>=0;i--)
        printf("%c",ans[i] );
    printf("\n");
}
int main()
{
    while(~scanf("%s%s",s,text))
    {
        int m = strlen(s);
        int n = strlen(text);
        getfail(s,Next);
//        for(int i = 0;i<m;i++)
//        {
//            cout<<i<<" "<<Next[i]<<endl;
//        }
        kmp(m,n);
    }
    return 0;
}



0 0
原创粉丝点击