专栏文章

P3375 【模板】KMP

P3375题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minps5kh
此快照首次捕获于
2025/12/02 06:21
3 个月前
此快照最后确认于
2025/12/02 06:21
3 个月前
查看原文

P3375 【模板】KMP

可以去看一下课程
注意:本代码没有从1开始读入\red{注意:本代码没有从1开始读入}
Code:
CPP
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int l1,l2,nxt[maxn],j = 0;//j -- prefix_len最长相同前后缀长度 
string s1,s2;
int main(){
  cin >> s1 >> s2;//注意:没有从第一个位置开始 
  l1 = s1.size(),l2 = s2.size();
  for(int i = 1;i < l2;i++){//从第二个数开始看   make next
  	while(j>0 && s2[i] != s2[j]) j = nxt[j-1];//不匹配
  	if(s2[i] == s2[j]) j++;//匹配成功
  	nxt[i] = j; 
  }
  j = 0;
  for(int i = 0;i < l1;i++){
  	while(j>0 && s1[i] != s2[j]) j = nxt[j-1];
  	if(s2[j] == s1[i]) j++;//匹配成功 
  	if(j == l2){
  		cout << i+1-l2+1 << endl;
  		j = nxt[j-1];
  	}
  } 
  for(int i = 0;i < l2;i++) cout << nxt[i] << " ";
  return 0;
} 

评论

0 条评论,欢迎与作者交流。

正在加载评论...