2016 UESTC Training for Search Algorithm & String K – 卿大爷的三个女友 KMP、跳转数组

ProLightsfx 2016-6-7 133 6/7

K - 卿大爷的三个女友 KMP、跳转数组

 

 

  Source

2016 UESTC Training for Search Algorithm & String

  My Solution

KMP 的跳转数组的拓展使用

关键在于KMP思维的转化。思维很重要!先用文本串做个跳转数组。

设文本串长度为len。

我们考虑匹配第len个位置。跳转数组每跳一个位置。

都能保证文本串的前缀==后缀,可以自己手动模拟画个看看。

故只需在剩下的中间部分找有没有匹配的子串即可。

一旦找到了就好了,这个就是最长的了^_^。

复杂度 O(T*n)

#include
#include
#include
using namespace std;
const int maxn=1e5 + 8;

int nxt[maxn], len;
char text[maxn];
void getnxt(char *p)
{
    nxt[1] = 0;
    for(int i = 1, j = 0; i < len; i++){
        j = nxt[i];
        while(j && p[j] != p[i])
            j = nxt[j];
        nxt[i+1] = p[j] == p[i] ? j+1 : 0;            //在这里进行初始化了, 故用的时候不要memset了
    }
}

bool kmp(char *T,char *P,int n,int m)
{
    for(int i=0, j=0; i < n; i++){ while(j && P[j] != T[i]) j = nxt[j]; if(P[j] == T[i]) j++; if(j == m) return true; } return false; } int main() { #ifdef LOCAL freopen("a.txt", "r", stdin); #endif // LOCAL int T,j,ans; scanf("%d",&T); while(T--){ ans=0; scanf("%s",text); len=strlen(text); getnxt(text); j = nxt[len]; while(j){ if(len >= 3*j&& kmp(text+j, text, len-2*j, j)){
                ans=j;
                break;
            }
            j = nxt[j];
        }
        printf("%dn",ans);
    }
    return 0;
}

 


非特殊说明,本博所有文章均为博主原创,未经许可不得转载。

https://www.prolightsfxjh.com/

Thank you!

                                                                                                                                             ------from ProLightsfx

- THE END -

ProLightsfx

11月15日21:35

最后修改:2024年11月15日
0

非特殊说明,本博所有文章均为博主原创,未经许可不得转载。

共有 0 条评论