前缀函数定义
定义来自于:OI Wiki
第一个版本:O(n3)
纯暴力。时间复杂度O(n3)
void get_pi(){
int len=strlen(str);
for (int i=0;i<len;i++){
for (int j=0;j<i;j++) {
int flag=0;
for (int k=0;k<=j;k++){
if (str[k]!=str[i-j+k]) flag=1;
}
if (!flag) pi[i]=j+1;
}
}
}
最终版本:O(n)
计算新的前缀函数可以由前面的前缀函数得到。有点像dp。如果当前新增的字符可以和历史的前缀函数配对。那么就可以直接由该前缀函数+1得到。如果不行的话,就一直向前找,直到找到符合条件的前缀函数。
void get_pi(){
int len=strlen(str);
pi[0]=0;
for (int i=1;i<len;i++){
int j=pi[i-1];
while (j>0&&str[i]!=str[j]) j=pi[j-1];
if (str[i]==str[j]) j++;
pi[i]=j;
}
}