【HDU 5880】 Family View | AC自动机、敏感词屏蔽

题目大意:

给出几个敏感词汇s_i,一个字符串t

需要将t字符串中所有的敏感词汇以*的形式输出

题目思路:

AC自动机板子题..

题目比较典型,博客存储一下。

不懂评论里可以交流

Code:

/*** keep hungry and calm CoolGuang!***/
#pragma GCC optimize(2)
//#include <bits/stdc++.h>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<iostream>
#include<algorithm>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define _CRT_SECURE_NO_WARNINGS
#pragma GCC optimize("Ofast","unroll-loops","omit-frame-pointer","inline")
#pragma GCC option("arch=native","tune=native","no-zero-upper")
#pragma GCC target("avx2")
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pp;
const ll INF=1e17;
const int Maxn=2e7+10;
const int maxn =1e6+10;
const int mod=1e9+7;
const int Mod = 1e9+7;
///const double eps=1e-10;
inline bool read(ll &num)
{char in;bool IsN=false;
    in=getchar();if(in==EOF) return false;while(in!='-'&&(in<'0'||in>'9')) in=getchar();if(in=='-'){ IsN=true;num=0;}else num=in-'0';while(in=getchar(),in>='0'&&in<='9'){num*=10,num+=in-'0';}if(IsN) num=-num;return true;}
ll n,m,p,S,T;
char s[maxn],t[maxn];
int nxt[maxn];
ull H[maxn],ft[maxn];
void getnext(char *p){
    int len = strlen(p+1);
    nxt[0] = 0;
    for(int i=1,j=0;i<=len;i++){
        while(j&&p[i+1] != p[j+1]) j = nxt[j];
        if(p[i+1] == p[j+1]) j++;
        nxt[i+1] = j;
    }
}
int len;
int judge(int x){
    if(H[x] != (H[len]-(H[len-x]*ft[x])%Mod+Mod)%Mod) return 0;
    ull temp = 0;
    for(int i=x+1;i<=len-1;i++)
        if((H[i]-(H[i-x]*ft[x])%Mod+Mod)%Mod == H[x]) return 1;
    return 0;
}
int main(){
    scanf("%s",s+1);
    getnext(s);
    len = strlen(s+1);
    ft[0] = 1;
    for(int i=1;i<=len;i++) ft[i] = (ft[i-1]*2333)%Mod;
    for(int i=1;i<=len;i++) H[i] = (H[i-1]*2333+s[i]-'a'+1)%Mod;
    int l = 1,r = len;
    int x = nxt[len];
    int ans = -1;
    while(x){
        if(judge(x)) {
            ans = x;
            break;
        }
        x = nxt[x];
    }
    if(~ans){
        for(int k=1;k<=x;k++) printf("%c",s[k]);
        printf("\n");
    }
    else printf("Just a legend\n");
    return 0;
}
/**
4
2
abcd
cdab
abcdab

ababab
**/

猜你喜欢

转载自blog.csdn.net/qq_43857314/article/details/107552233