zoukankan      html  css  js  c++  java
  • hdu 2594 Simpsons’ Hidden Talents

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

    题意前面一堆废话,就是问给出两个字符串s1和s2,问s1的前缀和s2的后缀最大匹配的数量,

    这很容易让人想到KMP中求next数组的方法,所以这里可以把s1,s2连接起来,strcat(s1,s2)该函数的作用就是把s2连接到s1的末端

    连接完之后就是对串s1进行求next代码详见kMP,接下来就是判断next[k]与len1和len2的关系

    如果next[k]大于len1或len2,则继续回溯k=next[k];

    这样判断next[k]是否为零,为零则没有匹配,不为零输出next[k]即是最大的匹配数

    View Code
     1 # include <string.h>
     2 # include <stdio.h>
     3 int len, len1, len2;
     4 int next[50005*2];
     5 char s1[50005],s2[50005];
     6 void COUNT_next(char *s1)
     7 {
     8     int i=0,j=-1;
     9     next[0]=-1;
    10     while(i<len)
    11     {
    12         if(j==-1 || s1[i]==s1[j])
    13         {
    14             ++i;
    15             ++j;
    16             next[i]=j;
    17         }
    18         else j = next[j];
    19     }
    20 }
    21 int main()
    22 {
    23 
    24     int i;
    25     while(scanf("%s",s1) != EOF)
    26     {
    27         scanf("%s",s2);
    28         len1=strlen(s1);
    29         len2=strlen(s2);
    30         len = len1+len2;
    31         strcat(s1,s2);
    32 
    33         COUNT_next(s1);
    34         int k=len;
    35         while(next[k]>len1 || next[k]>len2)
    36             k=next[k];
    37         if(next[k]==0)
    38             printf("0\n");
    39         else
    40         {
    41             for(i=0;i<next[k];i++)
    42                 printf("%c",s1[i]);
    43             printf(" %d\n",next[k]);
    44         }
    45     }
    46     return 0;
  • 相关阅读:
    HDU4465 Candy
    《有关概率和期望问题的研究》读书笔记(完成度:40%)
    HDU5583 Kingdom of Black and White
    Gym100548F Color
    HDU6035 Colorful Tree
    Echarts笔记
    springMVC
    Struts2
    SSH框架学习中遇到的问题
    I/O流
  • 原文地址:https://www.cnblogs.com/sunshinecyh/p/3029195.html
Copyright © 2011-2022 走看看