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

    题目描述

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

    输入输出格式

    输入格式:
    第一行为一个字符串,即为s1
    第二行为一个字符串,即为s2
    输出格式:
    若干行,每行包含一个整数,表示s2在s1中出现的位置
    接下来1行,包括length(s2)个整数,表示前缀数组next[i]的值。

    p[i]存指针,指向字符串失配后再次匹配的位置

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1000000+100;
    int p[maxn];
    char a[maxn],b[maxn];
    int n,m;
    void pre()//求p[i]相当于对自己串求kmp
    {
    	p[1]=0;
    	int j=0;
    	for(int i=1;i<m;i++)
    	  {
    	  while(j>0&&b[j+1]!=b[i+1])j=p[j];
    	  if(b[j+1]==b[i+1])++j;
    	  p[i+1]=j;
          }
    	  
    }
    void kmp()
    {
    	int j=0;
    	for(int i=0;i<n;i++)
    	{
    		while(j>0&&a[i+1]!=b[j+1])j=p[j];
    		if(a[i+1]==b[j+1])++j;
    		if(j==m)
    		{
    			printf("%d
    ",i+2-m);
    			j=p[j];//继续匹配
    		}
    	}
    }
    int main()
    {
    	scanf("%s%s",a+1,b+1);
    	n=strlen(a+1),m=strlen(b+1);
    	pre();
    	kmp();
    	for(int i=1;i<=m;i++)
    	printf("%d ",p[i]);
    	return 0;
    }
    
  • 相关阅读:
    线程私有关键字配合static使用
    对定义局部变量位置的思考
    获取文件的md5值
    JNI接口的整理
    数兔子问题
    使用XML布局文件和java代码混合控制UI界面
    应用程序类型
    android组成
    封装
    接口
  • 原文地址:https://www.cnblogs.com/DriverBen/p/10536032.html
Copyright © 2011-2022 走看看