zoukankan      html  css  js  c++  java
  • HDOJ 2087

     1 // HDOJ 2087 KMP算法
     2 #include<iostream>
     3 using namespace std;
     4 
     5 #include<string>
     6 
     7 void nextval(char s2[],int next[],int len)
     8 {
     9         next[1] = 0;
    10         int i = 1,j = 0;
    11         while(i < len)//这里是小于号而不是小于等于是因为里面有自加,防止越界!
    12         {
    13                 if(j == 0 || s2[i] == s2[j])
    14                 {
    15                         ++i;
    16                         ++j;
    17                         if(s2[i] != s2[j]) next[i] = j;
    18                         else next[i] = next[j];
    19                 }
    20                 else j = next[j];
    21         }
    22 }
    23 
    24 int KMP(char s1[],char s2[],int len1,int len2,int next[],int pos)
    25 {
    26         int i = pos,j = 1;
    27         while(i <= len1 && j <= len2)
    28         {
    29                 if(j == 0 || s1[i] == s2[j])
    30                 {
    31                         ++i;
    32                         ++j;
    33                 }
    34                 else j = next[j];
    35         }
    36         if(j > len2) return i;
    37         else return 0;
    38 }
    39 
    40 int main()
    41 {
    42         string s1,s2;
    43         while(cin>>s1 && s1 != "#")
    44         {
    45                 cin>>s2;
    46                 int next[s2.size()+1],c = 0,pp = 0;
    47                 next[0] = -1;
    48                 char c1[s1.size()+1],c2[s2.size()+1];
    49                 for(int i = 1;i <= s1.size();++i) c1[i] = s1[i-1];
    50                 for(int i = 1;i <= s2.size();++i) c2[i] = s2[i-1];
    51                 nextval(c2,next,s2.size());
    52                 for(int pos = 1;pos <= s1.size();)
    53                 {
    54                         pp = KMP(c1,c2,s1.size(),s2.size(),next,pos);
    55                         if(pp)
    56                         {
    57                                 ++c;
    58                                 pos = pp;
    59                         }
    60                         else break;
    61                 }
    62                 cout<<c<<endl;
    63         }
    64 
    65         return 0;
    66 }
  • 相关阅读:
    poj 2516 Minimum Cost (最小费用流 )
    new start
    关于c语言中的声明和定义
    多态性与虚函数之对象切片
    C专家编程之typedef
    QGroupBox设置边框
    多态性与虚函数之继承中的virtual 晚捆绑
    使用Map
    遍历控件
    C专家编程之枚举
  • 原文地址:https://www.cnblogs.com/maowang1991/p/2798681.html
Copyright © 2011-2022 走看看