萌新yy出的算法不知道有没有问题
查看原帖
萌新yy出的算法不知道有没有问题
752094
MornHus楼主2023/3/6 13:45

因为数据较小,我不会检验这个算法的正确性。

刚学完前缀,想到可不可以用一个字符串的最大相等前后缀来实现“跳着”查询,听起来有点扯,但是竟然过了……

代码:

#include<bits/stdc++.h>
using namespace std;
int suma[30],sumb[30],lena,lenb;
char a[30];
char b[30];
inline void printa(){
	for(int i=1;i<=lena;i++){
		cout<<a[i];
	}
}
inline void printb(){
	for(int i=1;i<=lenb;i++){
		cout<<b[i];
	}
}
int main(){
	scanf("%s%s",b+1,a+1);
	lena=strlen(a+1);
	lenb=strlen(b+1);
	for(int i=2;i<=lena;i++){
		int j=suma[i-1];
		while(j&&a[i]!=a[j+1]){
			j=suma[j];
		} 
		if(a[i]==a[j+1]){
			j++;
		} 
		suma[i]=j;
	}
	for(int i=2;i<=lenb;i++){
		int j=sumb[i-1];
		while(j&&b[i]!=b[j+1]){
			j=sumb[j];
		} 
		if(b[i]==b[j+1]){
			j++;
		} 
		sumb[i]=j;
	}
	int j=0;//用B串查A串 
	for(int i=1;i<=lena;i++){
		while(j&&a[i]!=b[j+1])j=sumb[j];
		if(b[j+1]==a[i]){
			j++;
		}
		if(j==lenb){ 
			printb();
			cout<<" is substring of ";
			printa();
			return 0;
		}
	}
	j=0;//再用A串查B串 
	for(int i=1;i<=lenb;i++){
		while(j&&b[i]!=a[j+1])j=suma[j];
		if(a[j+1]==b[i]){
			j++;
		}
		if(j==lena){
			printa();
			cout<<" is substring of ";
			printb();
			return 0;
		}
	}
	cout<<"No substring";
	return 0;
} 
2023/3/6 13:45
加载中...