[模板]KMP
很早之前学的KMP因为没大用过一直不理解原理,今天训练赛做到一个基本裸的没打出来,于是上网又搜了一些资料看,大致理解了原理,打了个相对简单的板子。
这东西还是挺好用的,最近要专门训练一下字符串的题。
#include <bits/stdc++.h> using namespace std; typedef long long int LL; #define st first #define nd second #define pb push_back #define mp make_pair #define pll pair <LL, LL> #define pii pair <int, int> #define rep(i,x) for(int i=1;i<=x;i++) const int N = 2e6+7; const int MX = 1e9+7; const LL INF = 1e18+9LL; string s,a,b; int nxt[N];//最长相等前后缀长度-1 void getnext(string s){ nxt[0] = -1; int k = -1; for (int q = 1; q < s.size(); q++) { while (k > -1 && s[k + 1] != s[q]) { k = nxt[k]; } if (s[k + 1] == s[q]) { k++; } nxt[q] = k; } } void kmp(string s,string p){ int k=-1; for(int i=0;i<s.size();i++){ while(k>-1&&p[k+1]!=s[i]){ k=nxt[k]; } if(p[k+1]==s[i]){ k++; } if(k==int(p.size())-1){ cout<<i+2-int(p.size())<<endl; i=i+1-int(p.size()); k=-1; } } } int main(){ string s1,s2; cin>>s1>>s2; getnext(s2); kmp(s1,s2); }