zoukankan      html  css  js  c++  java
  • KMP算法详解

    http://www.matrix67.com/blog/archives/115

    上面的文章虽然讲的很详细 不过还是没看太懂

    看 了下面的公式和讲解 思想明了

    简单KMP练习http://poj.org/problem?id=3461

    View Code
     1 #include<stdio.h>
     2 #include<string.h>
     3 char w[10001],p[1000001];
     4 int next[10001];
     5 long num;
     6 void fnext(char *c1)
     7 {
     8     int i,j,k1;
     9     k1 = strlen(c1);
    10     j = -1;
    11     next[0] = -1;
    12     for(i = 1 ; i < k1 ; i++)
    13     {        
    14         while(j>-1&&c1[i]!=c1[j+1])
    15             j = next[j];
    16         if(c1[i]==c1[j+1])
    17             j++;
    18         next[i] = j;
    19     }
    20 }
    21 void kmp(char *c1,char *c2)
    22 {
    23     int k1,k2,i,j = -1;
    24     k1 = strlen(c1);
    25     k2 = strlen(c2);
    26     next[0] = -1;
    27     for(i = 0 ; i < k2 ; i++)
    28     {
    29         while(j>-1&&c2[i]!=c1[j+1])
    30         j = next[j];
    31         if(c2[i]==c1[j+1])
    32             j++;
    33         if(j==k1-1)
    34         {
    35             j = next[j];
    36             num++;
    37         }
    38     }
    39 }
    40 int main()
    41 {
    42     int i,j,t,k;
    43     scanf("%d%*c", &t);
    44     while(t--)
    45     {
    46         num = 0;
    47         gets(w);
    48         gets(p);
    49         fnext(w);
    50         kmp(w,p);
    51         printf("%ld\n",num);
    52     }
    53     return 0;
    54 }

     http://poj.org/problem?id=3080

    KMP+暴力

    感觉写复杂了。

    View Code
      1 #include<stdio.h>
      2 #include<string.h>
      3 char w[61];
      4 int next[10001];
      5 long num[101];
      6 typedef struct node
      7 {
      8     char c[61];
      9     int k;
     10 }st;
     11 st m[1001];
     12 char p[11][61];
     13 void fnext(char *c1)
     14 {
     15     int i,j,k1;
     16     k1 = strlen(c1);
     17     j = -1;
     18     next[0] = -1;
     19     for(i = 1 ; i < k1 ; i++)
     20     {        
     21         while(j>-1&&c1[i]!=c1[j+1])
     22             j = next[j];
     23         if(c1[i]==c1[j+1])
     24             j++;
     25         next[i] = j;
     26     }
     27 }
     28 int kmp(char *c1,char *c2)
     29 {
     30     int k1,k2,i,j = -1,flag = 0;
     31     k1 = strlen(c1);
     32     k2 = strlen(c2);
     33     next[0] = -1;
     34     for(i = 0 ; i < k2 ; i++)
     35     {
     36         while(j>-1&&c2[i]!=c1[j+1])
     37         j = next[j];
     38         if(c2[i]==c1[j+1])
     39             j++;
     40         if(j==k1-1)
     41         {
     42             flag = 1;
     43             break;
     44         }
     45     }
     46     return flag;
     47 }
     48 int pa(char *x,int n)
     49 {
     50     int y,f = 1;
     51     fnext(x);
     52     for(y = 1; y < n ; y++)
     53         if(!kmp(x,p[y]))
     54         {
     55             f = 0;
     56             break;
     57         }
     58     return f;
     59 }
     60 int main()
     61 {
     62     int i,j,t,k,o,max,n,y,f,pf;
     63     char x[61],str[61];
     64     scanf("%d%*c", &t);
     65     while(t--)
     66     {
     67         o = 0;
     68         int g = 0;
     69         for(i = 0 ; i <= 60 ; i++)
     70             m[i].k = 0;
     71         scanf("%d%*c",&n);
     72         gets(w);
     73         for(i = 1 ; i < n ; i++)        
     74         gets(p[i]);        
     75         for(i = 0 ;i <strlen(w) ; i++)
     76         {
     77             g = 0;
     78             x[g] = w[i];
     79             x[g+1]='\0';        
     80             f = 1;
     81             pf = 0;
     82             if(pa(x,n))
     83             {
     84                 j = i;
     85                 while(pa(x,n)&&j<strlen(w))
     86                 {
     87                     pf = 1;
     88                     j++;
     89                     g++;
     90                     x[g] = w[j];
     91                     x[g+1] = '\0';                    
     92                 }
     93                 if(pf)
     94                     x[g]='\0';
     95                 o++;
     96                 strcpy(m[o].c,x);
     97                 m[o].k = strlen(x);
     98             }
     99         }
    100         max = 0;    
    101         for(i = 1 ; i <= o ; i++)
    102             if(m[i].k>max)
    103                 max = m[i].k;
    104         for(i = 1; i <= o ; i++)
    105             if(m[i].k == max)
    106             {
    107                 strcpy(str,m[i].c);
    108                 break;
    109             }
    110         for(i = 1; i <= o ; i++)
    111             if(m[i].k == max)
    112             {
    113                 if(strcmp(str,m[i].c)>0)
    114                 strcpy(str,m[i].c);
    115             }
    116         if(max<3)
    117             printf("no significant commonalities\n");
    118         else
    119             puts(str);
    120     }
    121     return 0;
    122 }

    补一篇写next函数的 写的很好

    http://blog.csdn.net/justlovetao/article/details/6737174
     

  • 相关阅读:
    快来使用Portainer让测试环境搭建飞起来吧
    ReviewBoard安装记录(CentOS5)
    awk中的NR,FNR ,NF,$NF,RS,ORS,FS,OFS
    Argument list too long解决办法
    Jenkins插件开发(6.3)—— 追踪jenkinscli.jar
    AWK中如何按列求和
    JIRA中显示中文显示为乱码“口口口”的解决方式(CentOS)
    Jenkins常用插件记录
    Jenkins插件开发(6.4)—— 分析CLI源码
    Jenkins插件开发(6.2)—— 如何自定义CLI命令
  • 原文地址:https://www.cnblogs.com/shangyu/p/2601007.html
Copyright © 2011-2022 走看看