首页 > 其他 > 详细

CHDU2014迎新杯比赛题解

时间:2016-04-16 20:57:51      阅读:178      评论:0      收藏:0      [点我收藏+]

A.神奇彩带

题意:给两个字符串 S 和 T ,让找一个最长的字符串 P 使得 P 是 S 的前缀且是 T 的后缀。

思路:考虑 KMP 算法中的 Next 数组即为所求。只需要在 S 和 T 之间用一个无效的字符连接起来,求其 Next 数组,Next[len] 即为答案。

推荐学习链接:

  从头到尾彻底理解 KMP 算法

技术分享
 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <cstring>
 5 #include <algorithm>
 6 using namespace std ;
 7 
 8 void nnnxt(char s[],int nxt[])
 9 {
10     memset(nxt,0,sizeof(nxt)) ;
11     int i = 0 , j = -1 , len = strlen(s) ;
12     nxt[0] = -1 ;
13     while (i < len) {
14         while (j != -1 && s[i] != s[j]) j = nxt[j] ;
15         nxt[++i] = ++ j ;
16     }
17 }
18 
19 char s[100010] , t[50010] ;
20 int nxt[100010] ;
21 
22 int main()
23 {
24     freopen("1.in","r",stdin) ;
25     //freopen("hehe.out","w",stdout) ;
26     while (~scanf("%s%s",s,t)) {
27         strcat(s,"#") ;
28         strcat(s,t) ;
29         nnnxt(s,nxt) ;
30         printf("%d\n",nxt[strlen(s)]) ;
31     }
32     return 0 ;
33 }
A.神奇彩带

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

~end~~_~

CHDU2014迎新杯比赛题解

原文:http://www.cnblogs.com/chdacm/p/5395046.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!