• hdu1867A + B for you again(kmp)


    http://acm.hdu.edu.cn/showproblem.php?pid=1867

    这题输出有点麻烦 两个KMP 找出从一个字符串开头到令一个字符串结尾匹配的最大长度 再根据字符串比较函数字典序输出

    View Code
     1 #include<stdio.h>
     2 #include<string.h>
     3 char c1[100001],c2[200001],c3[100001],c4[200001];
     4 int next[100001];
     5 int kmp(char *a,char *b)
     6 {
     7     int k1 = strlen(a),k2 = strlen(b),i,j,y;
     8     y = -1;
     9     memset(next,0,sizeof(next));
    10     next[0] = -1;
    11     for(i = 1 ; i < k2 ; i++)
    12     {
    13         while(y>-1&&b[y+1]!=b[i])
    14             y = next[y];
    15         if(b[y+1]== b[i])
    16             y++;
    17         next[i] = y;
    18     }
    19     y=-1;
    20     next[0] = -1;
    21     for(i = 0  ;i < k1 ; i++)
    22     {
    23         while(y>-1&&a[i]!=b[y+1])
    24         y = next[y];
    25         if(a[i]==b[y+1])
    26             y++;
    27         if(y == k2-1)
    28         {
    29             if(i == k1-1)
    30                 return y+1;
    31             y = next[y];
    32         }
    33         
    34     }
    35     if(i==k1)
    36     return y+1;
    37     else
    38         return 0;
    39 }
    40 int main()
    41 {
    42     int i,j,k,n,m,k1,k2;
    43     while(scanf("%s %s", c1,c2)!=EOF)
    44     {
    45         int n1 = kmp(c1,c2);
    46         int n2 =  kmp(c2,c1);    
    47         k1 = strlen(c1);
    48         k2 = strlen(c2);
    49         if(n1==n2)
    50         {
    51             if(strcmp(c1,c2)<0)
    52             {
    53                 printf("%s", c1);
    54                 for(i = n1 ; i < k2 ; i++)
    55                     printf("%c",c2[i]);
    56                 printf("\n");
    57             }
    58             else
    59             {                
    60                 printf("%s", c2);
    61                 for(i = n1 ; i < k1 ; i++)
    62                     printf("%c",c1[i]);
    63                 printf("\n");
    64             }
    65         }
    66         else
    67         if(n1>n2)
    68         {
    69             printf("%s", c1);
    70             for(i = n1 ; i < k2 ; i++)
    71                 printf("%c",c2[i]);
    72             printf("\n");
    73         }
    74         else
    75         {
    76             printf("%s", c2);
    77             for(i = n2 ; i < k1 ; i++)
    78                 printf("%c",c1[i]);
    79             printf("\n");
    80         }
    81     }
    82     return 0;
    83 }
  • 相关阅读:
    C++文件流操作与流缓冲重定向
    转减小编译时间的两种做法
    AFX_MANAGE_STATE(AfxGetStaticModuleState())
    一个游戏程序员的资料一(转)
    ACE的Doublecheckedlocking的Singleton
    Hibernate 过滤器
    悲观锁 HibernateTest.java
    HQL 语句
    HQL 查询语句
    Hibernate 中继承映射之三 每一个类一个表
  • 原文地址:https://www.cnblogs.com/shangyu/p/2612153.html
Copyright © 2020-2023  润新知