zoukankan      html  css  js  c++  java
  • 洛谷P3375 【模板】KMP字符串匹配

    题目描述

    如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置。

    为了减少骗分的情况,接下来还要输出子串的前缀数组next。

    (如果你不知道这是什么意思也不要问,去百度搜[kmp算法]学习一下就知道了。)

    输入输出格式

    输入格式:

    第一行为一个字符串,即为s1(仅包含大写字母)

    第二行为一个字符串,即为s2(仅包含大写字母)

    输出格式:

    若干行,每行包含一个整数,表示s2在s1中出现的位置

    接下来1行,包括length(s2)个整数,表示前缀数组next[i]的值。

    输入输出样例

    输入样例#1: 复制
    ABABABC
    ABA
    输出样例#1: 复制
    1
    3
    0 0 1 
    

    说明

    时空限制:1000ms,128M

    数据规模:

    设s1长度为N,s2长度为M

    对于30%的数据:N<=15,M<=5

    对于70%的数据:N<=10000,M<=100

    对于100%的数据:N<=1000000,M<=1000000

    样例说明:

    所以两个匹配位置为1和3,输出1、3

    比kmp好理解的多

    把b串做成一个hash值

    在a串中不断的匹配就好

    时间复杂度:O(n)O(n)

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #define ull unsigned long long 
     5 using namespace std;
     6 const int MAXN=2e7+10;
     7 const int mod=19260817;
     8 const int seed=233;
     9 ull po[MAXN];
    10 ull hash(ull *a,int l,int r)
    11 {
    12     if(l-1<0)    return a[r];
    13     return a[r]-po[r-l+1]*a[l-1];
    14 }
    15 char s1[MAXN],s2[MAXN];
    16 ull h1[MAXN],h2;
    17 int l1,l2;
    18 int nxt[MAXN];
    19 int main()
    20 {
    21     po[0]=1;
    22     for(int i=1;i<=10001;i++)    po[i]=po[i-1]*seed;
    23     scanf("%s",s1);scanf("%s",s2);
    24     l1=strlen(s1);l2=strlen(s2);
    25     for(int i=0;i<l1;i++)    h1[i]=h1[i-1]*seed+s1[i];
    26     for(int i=0;i<l2;i++)    h2=h2*seed+s2[i];
    27     for(int i=0;i<l1;i++)
    28         if(hash(h1,i,i+l2-1)==h2)
    29             printf("%d
    ",i+1);
    30         
    31     int j=0;
    32     for(int i=1;i<l2;i++)
    33     {
    34         while(j>0&&s2[i]!=s2[j])    j=nxt[j-1];
    35         if(s2[i]==s2[j])    j++;
    36         nxt[i]=j;
    37     }//题目中说要输出nxt数组 
    38     for(int i=0;i<l2;i++)    printf("%d ",nxt[i]);
    39     return 0;
    40 }
  • 相关阅读:
    Spring容器启动前传——web应用
    三方依赖bean初始化导致项目启动失败问题
    一个静态内部类单例引发的思考
    依赖传递
    kafka
    设置旋转元素的基点位置
    keep-alive 的 Props && 钩子函数
    css处理文字: 单行居中 多行居左
    localStorage 存 取 删
    for循环中暂停,async await
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/7793347.html
Copyright © 2011-2022 走看看