字符串处理
/*返回值为模式串在主串中匹配的次数*/
1. KMP 算法
int KMP(char s[],char t[])
/*next[i]
为失配指针*/ {
void
getnext(char s[]) int i,j,ans;
{
ans=i=j=0;
memset
(next,0,sizeof(next)); getnext(s);
next
[0]=-1; int
int
j=-1,k=0;
len=strlen(t),len1=strlen(s); int
len=strlen(s); while(i<len){ while
(k<len)
{ if(j==-
if(j==-1||s[j]==s[k]){ 1||
s[j]==t[i]){i++;j++;} j++;k++;
else j=next[j]; next[k]=j;
if(j==len1){
} ans++; else
//j=nex[j]; 可 重 叠 匹 配 j=next[j];
j=0;//不可重叠匹配
}
}
}
}
return ans;
}
2. 后缀数组
int
sa[maxn],c[maxn],y[maxn],x[maxn];/
/x 为后缀数组 bool cmp(int *p,int
a,int b,int l){ return
y[a]==y[b]&&y[a+l]==y[b+l];
}
//从 0 开始,m 为字符上界+1,范围是 0~n-1,n 为字符串长度
+1,后缀 0 到后缀 n
void build_sa(int m,int n)
4