把俩串联在一起,用‘#’隔开,答案就是fail[n]
#include <cstdio>
#include <cstring>
#define N 50010
char s[N<<1],s2[N];
int n,fail[N<<1];
inline void getfail(){
int k=0;fail[1]=0;
for(int i=2;i<=n;++i){
while(k&&s[k+1]!=s[i]) k=fail[k];
if(s[k+1]==s[i]) ++k;
fail[i]=k;
}
}
int main(){
// freopen("a.in","r",stdin);
while(scanf("%s%s",s+1,s2+1)!=EOF){
n=strlen(s+1);int len=strlen(s2+1);
s[++n]='#';
for(int i=1;i<=len;++i) s[++n]=s2[i];s[n+1]=0;
getfail();
if(fail[n]==0) puts("0");
else printf("%s %d\n",s+n-fail[n]+1,fail[n]);
}
return 0;
}

本文介绍了一种用于字符串匹配的高效算法,并通过实例演示了如何实现该算法。文章首先定义了一个特殊的字符串模式,然后通过预处理阶段计算出一个辅助数组,用于加速后续的字符串匹配过程。在主函数中,算法将两个输入字符串串联并插入特定字符,之后通过预先计算好的辅助数组来优化匹配过程。当匹配成功时,会输出匹配的子串及其长度。
382

被折叠的 条评论
为什么被折叠?



