POJ 2406 入门KMP

以前写过一点字符串匹配方面的题目,但是理解不深刻,这次打算从入门级的步步深入

题意:求字符串子串的最大周期,至于要对字符串进行一遍预处理即可

#include <cstdio>

#include <cstdlib>

#include <cstring>



char b[1000010];

int p[1000010];



void getp(int m)

{

    p[1] = 0;

    int j = 0;

    for (int i = 2; i <= m; ++i)

    {

        while (j > 0 && b[j+1] != b[i])

            j = p[j];

        if (b[j+1] == b[i])

            ++j;

        p[i] = j;

    }

}



int main()

{

    while (scanf("%s", b + 1) != EOF)

    {

        if (b[1] == '.')

            break;

        int m = strlen(b + 1);

        getp(m);

        if (m % (m-p[m]) == 0)

            printf("%d\n", m/(m-p[m]));

        else

            printf("1\n");

    }

    return 0;

}

你可能感兴趣的:(poj)