求助
查看原帖
求助
542881
日常放水WT双奔楼主2022/7/27 22:53

以0为起点算的字符串

#include<bits/stdc++.h>
#define _for(i,a,b) for(int i=a;i<=b;i++)
#define __for(i,a,b) for(int i=a;i>=b;i--)
typedef unsigned long long ull;
using namespace std;
const int maxn=1e5;
int main(){
	int next[maxn+10];
	string s1,s2;
	cin>>s1>>s2;
	if(s1.length()<s2.length())swap(s1,s2);
	//求next数组 
	memset(next,0,sizeof(next));
	next[0]=0;next[1]=0;
	int j=0;
	_for(i,2,s2.length()-1){//计算第i位的最长相同前后缀 
		while(j&&s2[i]!=s2[j])j=next[j];//若无法匹配则往前找,除非找到头 
		if(s2[i]==s2[j]) next[i]=j++;//找到了 
		else next[i]=0;//找到头也找不到 
	}
	
	//匹配
	j=0;
	_for(i,0,s1.length()-1){
		while(j&&s1[i]!=s2[j]) j=next[j];//不匹配则前移 
		if(s1[i]==s2[j])j++;//能够匹配则继续匹配下一位
		if(j==s2.length()) printf("%d\n",i-s2.length()+2),j=next[j]+1;
	}
	
	//next 
	_for(i,0,s2.length()-1)printf("%d ",i>1?next[i]+1:next[i]);
	putchar('\n');
	
	return 0;
}

2022/7/27 22:53
加载中...