因为数据较小,我不会检验这个算法的正确性。
刚学完前缀,想到可不可以用一个字符串的最大相等前后缀来实现“跳着”查询,听起来有点扯,但是竟然过了……
代码:
#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;
}