题目大意:
给出几个敏感词汇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
**/