trie树
struct Node
{
int id;
bool end;
Node *ptr[MAXN];
// Node():id(-1),end(0){for(int i=0;i<MAXN;i++)ptr[i]=NULL;}
}*root;
Node MEM[N];
int getvalue(char *s)
{
int i,j;
Node *r;
r=root;
for(i=0;i<strlen(s);i++)
{
if(r->ptr[s[i]-'a']==NULL)
{
Node *temp=&MEM[index++];
temp->end=0;
temp->id=-1;
for(j=0;j<MAXN;j++)temp->ptr[j]=NULL;
r->ptr[s[i]-'a']=temp;
}
r=r->ptr[s[i]-'a'];
}
if(r->end)return r->id;
r->id=cnt++;
r->end=1;
return r->id;
}
初始化:
index=0;
root=&MEM[index++];
root->end=0;
root->id=-1;
for(i=0;i<MAXN;i++)root->ptr[i]=NULL;
KMP算法
P[1]:=0;
j:=0;
for i:=2 to m do
begin
while (j>0) and (B[j+1]<>B[i]) do j:=P[j];
if B[j+1]=B[i] then j:=j+1;
P[i]:=j;
end;
如果从0开始:
len=strlen(s);
p[0]=-1;
j=-1;
for(i=1;i<len;i++)
{
while(j>-1&&s[j+1]!=s[i])
j=p[j];
if(s[j+1]==s[i])
j++;
p[i]=j;
}
重复次数为:
len%(len-p[len-1]-1)==0?len/(len-p[len-1]-1):1