日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P3375 【模板】KMP字符串匹配

發布時間:2023/12/13 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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<=1000

樣例說明:

所以兩個匹配位置為1和3,輸出1、3

代碼輸出:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

#include<iostream>
#include<cstdio>
#include<cstring>
#define Ll long long
using namespace std;
int p[1001];
char? s[1000005],ss[1000005];
int n,m;
void make()
{

??? p[0]=-1;
??? int j;
??? for(int i=1;i<=m;i++)
??? {
??????? j=p[i-1];
??????? while(j!=-1&&ss[i]!=ss[j+1])
??????????? {
??????????????? j=p[j];
??????????? }
??????? p[i]=++j;
??? }
}
void find()
{
??? int j=0;
??? for(int i=1;i<=n;i++)
??? {
??????? while(j!=-1&&s[i]!=ss[j+1])
??????? j=p[j];
??????? j++;
??????? if(j==m)printf("%d\n",i-m+1);
??? }
}
int main()
{
??? scanf("%s%s",s+1,ss+1);
??? n=strlen(s+1);
??? m=strlen(ss+1);
??? make();
??? find();
??? for(int i=1;i<=m;i++)
??? {
??????? printf("%d ",p[i]);
??? }
}

轉載于:https://www.cnblogs.com/suibingchen/p/6795258.html

總結

以上是生活随笔為你收集整理的P3375 【模板】KMP字符串匹配的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。