欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

whj rhx kmp算法

时间:2024-05-26 14:40 作者:admin 点击:
#include bits/stdc++.h using namespace std; //kmp算法 //构建next数组 vectorint getNext(string s){ vectorint nt(s.size()+1,0); int i=0,j=-1; nt[i]=j; while(i=s.size()){ if(j==-1||s[i]==s[j]) nt[++i]=++j; else j=nt[j]; } return nt; } //

#include <bits/stdc++.h>

using namespace std;

//kmp算法

//构建next数组

vector<int> getNext(string s){

   vector<int> nt(s.size()+1,0);

   int i=0,j=-1;

   nt[i]=j;

   while(i<=s.size()){

       if(j==-1||s[i]==s[j]) nt[++i]=++j;

       else j=nt[j];

   }

   return nt;

}

//KMP搜索

vector<int> KMPSearch(string s,string t){

   vector<int> ans,nt=getNext(t);

   int i=0,j=0;

   while(i<s.size()){

       while(j!=0&&s[i]!=t[j]) j=nt[j];

       if(s[i]==t[j]) j++;

       if(j==t.size()) ans.push_back(i-j+1);

       i++;

   }

   return ans;

}

//1467 通过前后缀相同,将前缀+中间位置的内容复制一份,则前后缀重合,因此长度为总长-前后缀长

//1468 找最短相同前后缀

int main(){

   vector<int> k=KMPSearch("abcdabcd","abc");

   for(int i=0;i<k.size();i++) cout<<k[i]<<" ";

   return 0;

}

(责任编辑:admin)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%