kmp模板
洛谷P3375#include <iostream>#include <cstring>using namespace std;const int N = 1000010;char s1[N], s2[N];int ne[N]; // ne[i]:s2前i位组成的子串的最长相等前缀后缀的长度int main(){s1[0] = ' ', s2[0] = ' ';cin &g
·
洛谷P3375
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1000010;
char s1[N], s2[N];
int ne[N]; // ne[i]:s2前i位组成的子串的最长相等前缀后缀的长度
int main()
{
s1[0] = ' ', s2[0] = ' ';
cin >> s1+1 >> s2+1; // 为方便可将字符串下标定义为从1开始
int len1 = strlen(s1) - 1, len2 = strlen(s2) - 1;
for(int i = 2, j = 0; i <= len2; i++)
{
while(j && s2[i] != s2[j+1]) j = ne[j]; //若匹配不成功, 则移动字符串进行再次匹配
if(s2[i] == s2[j+1]) j++;
ne[i] = j;
}
for(int i = 1, j = 0; i <= len1; i++)
{
while(j && s1[i] != s2[j+1]) j = ne[j];
if(s1[i] == s2[j+1]) j++;
if(j == len2) // 成功匹配
{
cout << i - j + 1 << endl;
j = ne[j];
}
}
for(int i = 1; i <= len2; i++) cout << ne[i] << ' ';
return 0;
}
更多推荐
所有评论(0)