KMP字符串acwing [操作系统入门]

编程

https://www.acwing.com/problem/content/833/

暴力谁都会,完全就是一句话:next[i] = j ; //以i为结尾的非前缀子串与(从1开始的前缀的字符串)相等的长度是多少,然后就是j咯 、、之前记忆力不好又不经常使用的我总是忘记

#include <iostream>

#include <cstring>

#include <cmath>

#include <stdio.h>

#include <cstdlib>

#include <algorithm>

#include <vector>

#include <set>

#include <map>

#include <iomanip>

#define rep(i,a,b) for(int i = a; i <= b ; i ++ )

#define pre(i,a,b) for(int i = b ; i >= a ; i --)

#define ll long long

#define inf 0x3f3f3f3f

#define ull unsigned long long

#define ios ios::sync_with_stdio(false),cin.tie(0)

using namespace std;

typedef pair<int,int> PII ;

/*

ull gethash(int i,int j){//get hash of [i,j]

return hs[j]-hs[i-1]*base[j-i+1];

}

bool judgehash(int i,int j){

ull x=gethash(i,j);//the part of son‘s hash

int id=lower_bound(v.begin(),v.end(),x)-v.begin();//found of two found

if(id==v.size())return false;//if not found

else return v[id]==x; //judge whether be found

}

*/

/*

void preget(int t)

{

if(t == 0){

return;

}

else if(t==1){

fish++;

}

else if(t==2){

h+=1;

}

else if(t==3)

{

fish++,h++;

}

else

return ;

}

int done()

{

yuer+=h;

h=0;

int cnt=0;

if(fish==0 && yuer==0)

{

return 0;

}

else if(fish==0){

cnt=1;

yuer--;

}

else

{

if(fish==1){

cnt=fish;

fish--;

}

else{

if(yuer<fish-1){

cnt=yuer;

yuer=0;

fish-=yuer;

}

else if(yuer==fish-1){

cnt=fish;

yuer=0,fish=0;

}

else if(yuer==fish){

cnt=fish+1;

fish=0,yuer=0;

}

else if(yuer>fish){

cnt=fish+2;

yuer-=(fish+1);

}

}

}

return cnt;

}

*/

const int N = 2e5 + 10,M=2e6 + 10;

int n ,m;

char p[M],s[M];

int ne[N];

int main()

{

ios;

cin>>n>>(p+1)>>m>>(s+1);

//get next position 以i为结尾的非前缀字符串与从1开始的字符串的最大长度

for(int i = 2,j=0;i<=n;i++){

while(j && p[i] != p[j+1]){

j=ne[j];

}

if(p[i]==p[j+1]){

j++;

}

ne[i]=j;

}

for(int i=1,j=0;i<=m;i++) //匹配过程

{

while(j && s[i] != p[j+1]){//j没有退回起点或者是s[i]和s[j]不匹配了

j=ne[j];

}

if(s[i]==p[j+1]){

j++;

}

if(j==n){//匹配成功

cout<<i-n<<" "; //因为这道题下标是从0开始的,所以+1去掉即可

j=ne[j]; //以j为终点的坐标与1开始的最大长度赋给j

}

}

return 0 ;

}

  

KMP字符串-acwing

以上是 KMP字符串acwing [操作系统入门] 的全部内容, 来源链接: utcz.com/z/518433.html

回到顶部