zoukankan      html  css  js  c++  java
  • 【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] = '';
    66             strcpy(des1, des);
    67             for (i=k; i<lens; ++i)
    68                 des1[lend++] = src[i];
    69             des1[lend] = '';
    70             if (strcmp(src1, des1) < 0) {
    71                 printf("%s
    ", src1);
    72             } else {
    73                 printf("%s
    ", 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
    ", q+j);
    86     }
    87 
    88     return 0;
    89 }
  • 相关阅读:
    vue-cli工具搭建vue-webpack项目
    关于闭包的理解
    运动-分页
    运动-无缝滚动
    运动-手风琴
    运动-模拟返回顶部
    运动—图片中心放大
    运动—运动框架
    webstorm 激活破解
    let和const
  • 原文地址:https://www.cnblogs.com/bombe1013/p/3693906.html
Copyright © 2011-2022 走看看