• Hihocoder #1015 : 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

    code

    写的时候不小心将i指针与j指针混用了,干脆将j改成k。

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 
     5 using namespace std;
     6 
     7 const int N = 1000100;
     8 char T[N],w[N];
     9 int n,m,Ans,C,p[N];
    10 
    11 void get_p() {
    12     p[1] = 0;
    13     for (int i=2; i<=m; ++i) {
    14         int k = p[i-1];
    15         while (k && w[i]!=w[k+1]) k = p[k];
    16         if (w[i]==w[k+1]) k++;
    17         p[i] = k;
    18     }
    19 }
    20 void kmp() {
    21     int k = 0;
    22     for (int i=1; i<=n; ++i) {
    23         while (k && T[i]!=w[k+1]) k = p[k];
    24         if (T[i]==w[k+1]) k++;
    25         if (k==m) Ans++;
    26     }
    27 }
    28 int main() {
    29     scanf("%d",&C);
    30     while (C--) {
    31         Ans = 0;
    32         memset(p,0,sizeof(p));
    33         scanf("%s%s",w+1,T+1);
    34         n = strlen(T+1);m = strlen(w+1);
    35         get_p();
    36         kmp();
    37         printf("%d
    ",Ans);
    38     }
    39     return 0;
    40 }
  • 相关阅读:
    1.27
    1.25
    Representation Learning with Contrastive Predictive Coding
    Learning a Similarity Metric Discriminatively, with Application to Face Verification
    噪声对比估计(负样本采样)
    Certified Adversarial Robustness via Randomized Smoothing
    Certified Robustness to Adversarial Examples with Differential Privacy
    Dynamic Routing Between Capsules
    Defending Adversarial Attacks by Correcting logits
    Visualizing Data using t-SNE
  • 原文地址:https://www.cnblogs.com/mjtcn/p/8628349.html
Copyright © 2020-2023  润新知