kmp+最小表示法

#include
#include
using namespace std;
const int N=10005;
int nex[N],f[N];//f为b以i结尾与a的前缀匹配最大长度 
void ne(string a){
	nex[1]=0;
	int n=a.size();
	for(int i=1,j=0;i0&&(b[i]!=a[j]))j=nex[j-1];
	    if(b[i]==a[j])j++;
	    f[i]=j;
	    //if(f[i]==n)a在b中出现的某一次 
	}
}
int main(){
	string a,b;
	cin>>b>>a;
	ne(a);
	kmp(b,a);
	for(int i=0;i
int k=0,i=0,j=1;
while(ks[(j+k)%n]?i=i+k+1:j=j+n+1;
		if(i==j)i++;
		k=0;
	}
}
i=min(i,j);//即从i开始的字符串为最小表示法 

你可能感兴趣的:(算法)