• hdu1686 最大匹配次数 KMP


    题意:
         给你两个串,问你串a在串b中出现了多少次。


    思路:

          直接匹配,KMP时匹配到匹配串的最后一个的时候不用跳出,直接匹配就行了,最后一个'/0'不会和目标串匹配,所以经过next[l2]就直接自动找到该去的位置了,怎么说呢,今天刚学的KMP,给我的感觉就是"记忆化搜索"。


    #include<stdio.h>
    #include<string.h>
    
    char a[1100000] ,b[11000];
    int next[11000];
    
    void get_next(int m)
    {
       int j ,k;
       j = 0 ,k = -1;
       next[0] = -1;
       while(j < m)
       {
          if(k == -1 || b[j] == b[k])
          next[++j] = ++ k;
          else
          k = next[k];
       }
       return ;
    }
    
    int KMP(int n ,int m)
    {
       int sum = 0;
       int i ,j;
       for(j = i = 0 ;i < n ;)
       {
          if(a[i] == b[j])
          {
             if(j == m - 1)
             sum ++;
             i ++ ,j ++;
          }
          else
          {
             j = next[j];
             if(j == -1)
             {
                j = 0;
                i ++;
             }
          }
       }
       return sum;
    }
    
    int main ()
    {
       int t ,n ,m;
       scanf("%d" ,&t);
       while(t--)
       {
          scanf("%s %s" ,b ,a);
          n = strlen(a);
          m = strlen(b);
          if(m > n) puts("0");
          else
          {
             get_next(m);
             printf("%d
    " ,KMP(n ,m));
          }
       }
       return 0;
    }
       

  • 相关阅读:
    用指针写线段树(维护乘法)
    费用流——网络流板子
    最小割板子题——[USACO5.4]奶牛的电信
    数论——置换
    NOIP2012 借教室
    POJ1990 moofest
    POJ2352 star
    POJ2299 Ultra-QuickSort
    CF498D Traffic Jams in the land
    POJ2828 Buy Ticket
  • 原文地址:https://www.cnblogs.com/csnd/p/12063112.html
Copyright © 2020-2023  润新知