社区讨论

kmp求调

P3375【模板】KMP参与者 2已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@m34cjhjy
此快照首次捕获于
2024/11/05 19:08
去年
此快照最后确认于
2024/11/05 20:08
去年
查看原帖
C
#include<bits/stdc++.h>
#define int long long
#define double long double
using namespace std;
const int N=1e6+10;
int n,m;
int p[N];
string s1,s2;
void pre(){
	int j=0;
	for(int i=1;i<m;i++){
		while(j>0&&s2[j+1]!=s2[i+1])j=p[j];
		if(s2[j+1]==s2[i+1])j++;
		p[i+1]=j;
	}
}
void kmp(){
	int j=0;
	for(int i=0;i<n;i++){
		while(j>0&&s2[j+1]!=s1[i+1])j=p[j];
		if(s2[j+1]==s1[i+1])j++;
		if(j==m){
			cout<<i+1-m+1<<"\n";
			j=p[j];
		}
	}
}
signed main(){
	cin>>s1>>s2;
	s1=' '+s1;
	s2=' '+s2;
	n=s1.length()+1;
	m=s2.length()+1;
	pre();
	kmp();
	for(int i=1;i<m-1;i++){
		cout<<p[i]<<' ';
	}
	return 0;
}
kmp出错,p数组对的

回复

1 条回复,欢迎继续交流。

正在加载回复...