[kmp例题] poj2406 Power Strings

题意:求出字符串的最大循环次数,例如abababab是4
我们考虑求next数组时,上下两个字符串不重叠的部分长度为t = len - next[len]
观察重叠部分,则下方字符串的[1,t] = 上方的[t+1,2t], 下方字符串的[t+1,2t] = 上方的[2t+1,3t], ...
如果len - t是t的整数倍,则可以得到字符串循环节的长度为t,否则没有循环节。

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int maxn = 2e6 + 10;

char p[maxn];
int ne[maxn];

void getnext(char *p) {
  int n = strlen(p + 1);
  for (int i = 2, j = 0; i <= n; i++) {
    while (j && p[j + 1] != p[i]) j = ne[j];
    if (p[j + 1] == p[i]) j++;
    ne[i] = j;
  }
}

int main() {
  while (scanf("%s", p + 1) && p[1] != '.') {
    getnext(p);
    int ans = 1;
    int l = strlen(p + 1);
    if (l % (l - ne[l]) == 0) ans = l / (l - ne[l]);
    printf("%d\n", ans);
  }
}
posted @ 2021-10-26 12:08  _vv123  阅读(34)  评论(0编辑  收藏  举报