P3375 【模板】KMP字符串匹配
很久没看看算法了。
这是复习。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int maxn = 1e6 + 7;
char s1[maxn], s2[maxn];
int k_next[maxn];
vector<int>ans;
void getNext(char* s, int k_next[])
{
int i, j, now;
int lens = strlen(s);
k_next[0] = 0;
for (j = 1; j < lens; j++)
{
now = k_next[j - 1];
while (now != 0 && s[now] != s[j])
{
now = k_next[now - 1];
}
if (s[now] == s[j])
{
k_next[j] = now + 1;
}
else
{
k_next[j] = 0;
}
}
}
void printNext(int k_next[],int len)
{
for (int i = 0; i < len-1; i++)
{
printf("%d ", k_next[i]);
}
printf("%d\n", k_next[len - 1]);
}
void kmp(char *s1,char *s2,int k_next[])
{
int len1 = strlen(s1);
int len2 = strlen(s2);
int j = 0;
for (int i = 0; i < len1; ++i)
{
while (j != 0 && s1[i] != s2[j])
j = k_next[j-1];
if (s1[i] == s2[j])
{
j++;
if (j == len2)
{
ans.push_back(i - len2 + 2);
j = k_next[j - 1];
}
}
else j = 0;
}
}
void printKmp()
{
for (int i = 0; i < ans.size(); i++)
{
printf("%d\n", ans[i]);
}
}
int main()
{
scanf("%s%s", s1, s2);
getNext(s2, k_next);
kmp(s1, s2, k_next);
printKmp();
printNext(k_next,strlen(s2));
//cout << "ok" << endl;
}
``