zoukankan      html  css  js  c++  java
  • hihoCoder #1015 : KMP算法【KMP裸题,板子】

    #1015 : KMP算法

    时间限制:1000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进。

    这一天,他们遇到了一只河蟹,于是河蟹就向小Hi和小Ho提出了那个经典的问题:“小Hi和小Ho,你们能不能够判断一段文字(原串)里面是不是存在那么一些……特殊……的文字(模式串)?

    小Hi和小Ho仔细思考了一下,觉得只能想到很简单的做法,但是又觉得既然河蟹先生这么说了,就肯定不会这么容易的让他们回答了,于是他们只能说道:“抱歉,河蟹先生,我们只能想到时间复杂度为(文本长度 * 特殊文字总长度)的方法,即对于每个模式串分开判断,然后依次枚举起始位置并检查是否能够匹配,但是这不是您想要的方法是吧?”

    河蟹点了点头,说道:”看来你们的水平还有待提高,这样吧,如果我说只有一个特殊文字,你能不能做到呢?“

    小Ho这时候还有点晕晕乎乎的,但是小Hi很快开口道:”我知道!这就是一个很经典的模式匹配问题!可以使用KMP算法进行求解!“

    河蟹满意的点了点头,对小Hi说道:”既然你知道就好办了,你去把小Ho教会,下周我有重要的任务交给你们!“

    ”保证完成任务!”小Hi点头道。

    提示一:KMP的思路

    提示二:NEXT数组的使用

    提示三:如何求解NEXT数组

    输入

    第一行一个整数N,表示测试数据组数。

    接下来的N*2行,每两行表示一个测试数据。在每一个测试数据中,第一行为模式串,由不超过10^4个大写字母组成,第二行为原串,由不超过10^6个大写字母组成。

    其中N<=20

    输出

    对于每一个测试数据,按照它们在输入中出现的顺序输出一行Ans,表示模式串在原串中出现的次数。

    样例输入
    5
    HA
    HAHAHA
    WQN
    WQN
    ADA
    ADADADA
    BABABB
    BABABABABABABABABB
    DAD
    ADDAADAADDAAADAAD
    样例输出
    3
    1
    3
    1
    0
    题目链接:https://hihocoder.com/problemset/problem/1015
    分析:裸题,没什么好解释的,板子套着用就行了!
    下面给出AC代码:
      1 #include <bits/stdc++.h>
      2 using namespace std;
      3 const int N=1000050;
      4 inline int read()
      5 {
      6     int x=0,f=1;
      7     char ch=getchar();
      8     while(ch<'0'||ch>'9')
      9     {
     10         if(ch=='-')
     11             f=-1;
     12         ch=getchar();
     13     }
     14     while(ch>='0'&&ch<='9')
     15     {
     16         x=x*10+ch-'0';
     17         ch=getchar();
     18     }
     19     return x*f;
     20 }
     21 int kmpnext[N];
     22 char s[N],t[N];///s为主串,t为模式串
     23 int slen,tlen;///slen为主串的长度,tlen为模式串的长度
     24 inline void getnext()
     25 {
     26     int i,j;
     27     j=kmpnext[0]=-1;
     28     i=0;
     29     while(i<tlen)
     30     {
     31         if(j==-1||t[i]==t[j])
     32         {
     33             kmpnext[++i]=++j;
     34         }
     35         else
     36         {
     37             j=kmpnext[j];
     38         }
     39     }
     40 }
     41 /*
     42 返回模式串T在主串S中首次出现的位置
     43 返回的位置是从0开始的。
     44 */
     45 inline int kmp_index()
     46 {
     47     int i=0,j=0;
     48     getnext();
     49     while(i<slen&&j<tlen)
     50     {
     51         if(j==-1||s[i]==t[j])
     52         {
     53             i++;
     54             j++;
     55         }
     56         else
     57             j=kmpnext[j];
     58     }
     59     if(j==tlen)
     60         return i-tlen;
     61     else
     62         return -1;
     63 }
     64 /*
     65 返回模式串在主串S中出现的次数
     66 */
     67 inline int kmp_count()
     68 {
     69     int ans=0;
     70     int i,j=0;
     71     if(slen==1&&tlen==1)
     72     {
     73         if(s[0]==t[0])
     74             return 1;
     75         else
     76             return 0;
     77     }
     78     getnext();
     79     for(i=0;i<slen;i++)
     80     {
     81         while(j>0&&s[i]!=t[j])
     82             j=kmpnext[j];
     83         if(s[i]==t[j])
     84             j++;
     85         if(j==tlen)
     86         {
     87             ans++;
     88             j=kmpnext[j];
     89         }
     90     }
     91     return ans;
     92 }
     93 int T;
     94 int main()
     95 {
     96     T=read();
     97     while(T--)
     98     {
     99         cin>>t;
    100         cin>>s;
    101         slen=strlen(s);
    102         tlen=strlen(t);
    103         cout<<kmp_count()<<endl;
    104     }
    105     return 0;
    106 }
  • 相关阅读:
    D. Constructing the Array
    B. Navigation System
    B. Dreamoon Likes Sequences
    A. Linova and Kingdom
    G. Special Permutation
    B. Xenia and Colorful Gems
    Firetrucks Are Red
    java getInstance()的使用
    java 静态代理和动态代理
    java 类加载机制和反射机制
  • 原文地址:https://www.cnblogs.com/ECJTUACM-873284962/p/7115617.html
Copyright © 2011-2022 走看看