【HDOJ】1867 A + B for you again

KMP算法的应用。

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 #define MAXNUM 100005
 5 
 6 char src[MAXNUM], des[MAXNUM];
 7 char src1[MAXNUM*2], des1[MAXNUM*2];
 8 int next[MAXNUM];
 9 
10 void getnext(char *p, int *next, int len) {
11     int j, k;
12     j = 0;
13     k = -1;
14     next[0] = -1;
15     while (j+1 < len) {
16         if (k==-1 || p[j]==p[k]) {
17             ++j;
18             ++k;
19             if (p[j] == p[k])
20                 next[j] = next[k];
21             else
22                 next[j] = k;
23         } else {
24             k = next[k];
25         }
26     }
27 }
28 
29 int kmp(char *src, char *des, int lens, int lend) {
30     int i, j;
31 
32     i = j = 0;
33     memset(next, 0, sizeof(next));
34     getnext(des, next, lend);
35     while (i < lens) {
36         while (src[i] != des[j]) {
37             if (next[j] == -1) {
38                 j = 0;
39                 break;
40             }
41             j = next[j];
42         }
43         if (src[i] == des[j])
44             ++j;
45         ++i;
46     }
47 
48     return j;
49 }
50 
51 int main() {
52     int i, j, k;
53     char *p, *q;
54     int lens, lend;
55 
56     while (scanf("%s %s", src, des) != EOF) {
57         lens = strlen(src);
58         lend = strlen(des);
59         j = kmp(src, des, lens, lend);
60         k = kmp(des, src, lend, lens);
61         if (j == k) {
62             strcpy(src1, src);
63             for (i=j; i<lend; ++i)
64                 src1[lens++] = des[i];
65             src1[lens] = '\0';
66             strcpy(des1, des);
67             for (i=k; i<lens; ++i)
68                 des1[lend++] = src[i];
69             des1[lend] = '\0';
70             if (strcmp(src1, des1) < 0) {
71                 printf("%s\n", src1);
72             } else {
73                 printf("%s\n", des1);
74             }
75             continue;
76         } else if (j > k) {
77             p = src;
78             q = des;
79         } else {
80             p = des;
81             q = src;
82             j = k;
83         }
84         printf("%s", p);
85         printf("%s\n", q+j);
86     }
87 
88     return 0;
89 }

 

转载于:https://www.cnblogs.com/bombe1013/p/3693906.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值