hdu2594 求s1前缀与s2后缀最长重合串

本文详细介绍了如何通过next数组优化字符串匹配过程,特别聚焦于找到两个字符串连接后的最大重复子串。通过代码实现,阐述了算法逻辑及应用,包括输入处理、next数组计算、重复子串定位等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

还是没能熟练掌握巧妙的next数组,把s2接到s1后面,求next数组

当next[n]>a||next[b]>b继续求next直到为0或者不满足这两种

此时next[n]值就是最大重复串

 1 #include<stdio.h>
 2 #include<string.h>
 3 int next[100005];
 4 char s1[100005],s2[100005];
 5 void getnext(int n)
 6 {
 7   int i,j;
 8   next[1]=j=0;
 9   for (i=2;i<=n;i++)
10   {
11     while (j>0&&s1[j+1]!=s1[i]) j=next[j];
12     if (s1[j+1]==s1[i]) j++;
13     next[i]=j;
14   }
15 }
16 int main()
17 {
18   int len1,len2,n,i;
19   while (~scanf("%s%s",s1,s2))
20   {
21     len1=strlen(s1); len2=strlen(s2);
22     strcat(s1,s2);
23     n=len1+len2;
24     for (i=n;i>=1;i--)
25       s1[i]=s1[i-1];
26     getnext(n);
27     while (next[n]!=0&&(next[n]>len1||next[n]>len2))
28       n=next[n];
29     if (next[n]==0) printf("0\n");
30     else{
31       for (i=1;i<=next[n];i++) printf("%c",s1[i]);
32       printf(" %d\n",next[n]);
33     }
34   }
35   return 0;
36 }
View Code

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2594

转载于:https://www.cnblogs.com/xiao-xin/articles/4266677.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值