Fork me on GitHub

SCAU 11077 最长公共连续子字符串

 

初级入门DP,感觉有点难招架,已经看了MIT算法导论就关于DP的视频有两遍了,逛逛飞燕社区也找了一下相关的资料,今早愣在机房尽想着写状态转移方程,最后还是只写了那么一条:dp[i, j] = a[i] == b[i] ? dp[i-1][j-1]+1 : 0; 串的长度达到了10^5,目测开到二维应该不行了,后来翻看算法导论的讲解视频,跪了,后面缩减空间的内容都忘了~~

11077 最长公共子字符串

时间限制:1000MS  内存限制:65535K

题型: 编程题   语言: 无限制

Description

求两个输入序列的最长的公共子字符串的长度。子字符串中的所有字符在源字符串中必须相邻。

如字符串:21232523311324和字符串312123223445,他们的最长公共子字符串为21232,长度为5。

输入格式

两行,第一行为第一个字符串X,第二行为第二个字符串Y,字符串不含空格并以回车标示结束。X和Y的串长都不超过100000

输出格式

两行,第一行为最长的公共子字符串的长度,第二行输出一个最长的公共子字符串。

说明:
(1)若最长的公共子字符串有多个,请输出在源字符串X中靠左的那个。
(2)若最长公共子字符串的长度为0,请输出空串(一个回车符)。

如输入:
21232523311324
152341231
由于523和123都是最长的公共子字符串,但123在源串X中更靠左,因此输出:
3
123

输入样例

21232523311324
312123223445

输出样例

5
21232

作者

zhengchan

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define MAXN 100010
 4 char a[MAXN], b[MAXN];
 5 int p[MAXN], q[MAXN];
 6 
 7 int main()
 8 {
 9 //    freopen("input.txt", "r", stdin);
10     int i, j, len_a, len_b, sum, x, y;
11     scanf("%s%s", a, b);
12     len_a = strlen(a);
13     len_b = strlen(b);
14     memset(p, 0, sizeof(p));
15     memset(q, 0, sizeof(q));
16     sum = 0;
17     for(i=0; i<len_a; ++i)
18     {
19         memcpy(q, p, sizeof(int)*len_b);
20         memset(p, 0, sizeof(p));
21         for(j=0; j<len_b; ++j)
22         {
23             if(a[i] == b[j])
24             {
25                 if(j == 0) p[j] = 1;
26                 else p[j] = q[j-1]+1;
27                 if(sum < p[j])
28                 {
29                     x = j;
30                     sum = p[j];
31                 }
32             }
33         }
34     }
35     printf("%d\n", sum);
36     a[sum--] = '\0';
37     for( ; sum>=0; --sum, --x)
38     a[sum] = b[x];
39     printf("%s\n", a);
40     return 0;
41 }

 

posted @ 2013-04-19 23:05  Gifur  阅读(914)  评论(0编辑  收藏  举报
TOP