藍橋複習——KMP
KMP
在s中尋找p(找到第一次出現的位置)
void find_next(char *p)
{
int h=strlen(p);
int k=-1;
int j=0;
next[j]=k;
while(j<h)
{
if(k==-1||p[k]==p[j])
{
j++;
k++;
next[j]=k;
}
else
k=next[k];
}
return ;
}
int kmp(char *s,char *p)
{
int hs=strlen(s);
int hp=strlen(p);
int i=0;
int j=0;
while(i<hs&&j<hp)
{
if(j==-1||s[i]==p[j])
{
i++;
j++;
}
else
j=next[j];
}
if(j==hp)
return i-j;
else
return -1;
}
求所有的子串位置
在next陣列裡,最後一位是不包括最後一個數,前面的字串的最長相同前字尾長度,如果要求所有的,就需要遍歷到最後一位+1的位置,遍歷到這裡其實是整個p字串最長相同前字尾長度。題目與程式碼如下
P3375 【模板】KMP字串匹配
傳送門
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
int next[1000100];
void find_next(string p)
{
int k=-1;
int j=0;
next[0]=-1;
while(j<p.size())
{
if(k==-1||p[k]==p[j])
{
k++;
j++;
// if(j!=p.size()&&p[k]==p[j])
// next[j]=next[k];
// else
next[j]=k;
}
else
k=next[k];
}
return ;
}
void Kmp(string s,string p)
{
int i=0,j=0;
int slen=s.size();
int plen=p.size();
while(i<slen&&j<plen)
{
if(j==-1||s[i]==p[j])
{
i++;
j++;
if(j==plen)
{
printf("%d\n",i-j+1);
j=next[j];
}
}
else
j=next[j];
}
return ;
}
int main()
{
string s,p;
cin>>s>>p;
find_next(p);
Kmp(s,p);
for(int i=1;i<=p.size();i++)
cout<<next[i]<<' ';
}
/*
ABABABAB
ABAB
*/
next陣列優化
void find_next(string p)
{
int k=-1;
int j=0;
next[0]=-1;
while(j<p.size())
{
if(k==-1||p[k]==p[j])
{
k++;
j++;
if(j!=p.size()&&p[k]==p[j])
next[j]=next[k];
else
next[j]=k;
}
else
k=next[k];
}
return ;
}
相關文章
- 2020藍橋杯競賽複習指導
- Luogu P10581 藍橋杯2024國A 重複的串 題解 [ 藍 ] [ KMP ] [ 動態規劃 ] [ 矩陣加速 ]KMP動態規劃矩陣
- 藍橋杯學習路線
- 複習(二):KMP、Trie、最大異或對、KMP
- 藍橋杯
- 【藍橋杯】練習題目彙總
- 藍橋杯練習系統題目集
- 藍橋杯:基礎練習 查詢整數
- 藍橋杯-分巧克力
- 藍橋杯-N皇后
- 藍橋杯真題
- 藍橋python——REPEAT 程式Python
- 藍橋9.26-3
- 藍橋杯 買瓜
- 藍橋杯 剪格子
- [藍橋杯][基礎練習VIP]矩形面積交
- 藍橋杯練習試題程式碼及講解
- 藍橋杯-數三角(ac程式碼時間複雜度分析)C程式時間複雜度
- 藍橋杯-長草(BFS)
- 藍橋杯-日期問題
- 藍橋杯-帶分數
- 藍橋杯-翻硬幣
- 藍橋杯-座次問題
- 藍橋杯 計算方程
- 藍橋杯-螞蟻感冒
- 藍橋杯-排列序數
- 如何準備藍橋杯
- 藍橋杯年號字串字串
- 藍橋杯考點整理
- 藍橋杯 分巧克力(Java)Java
- 藍橋杯訓練2
- 藍橋杯 整數拼接
- 藍橋杯注意的地方
- 藍橋杯試題 基礎練習 特殊迴文數
- 問題 1462: [藍橋杯][基礎練習VIP]Huffuman樹
- 【藍橋杯】計蒜客2017模擬賽A習題整理
- 2013年藍橋杯真題
- 藍橋杯-日誌統計