当前位置: 代码迷 >> 综合 >> POJ 2406 KMP
  详细解决方案

POJ 2406 KMP

热度:43   发布时间:2024-02-12 03:52:08.0
题意

传送门 POJ 2406

题解

K M P KMP 算法中 b [ i ] b[i] 代表字符串区间 [ 0 , i ? 1 ] [0,i-1] 的最长且相等的前缀与后缀长度。设字符串长度为 l e n len ,那么循环节的长度为 l e n ? b [ l e n ] len-b[len] ;若不满足 l e n % ( l e n ? b [ l e n ] ) = = 0 len\%(len-b[len])==0 n = 1 n=1

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
#define maxn 1000005
char s[maxn];
int b[maxn];void kmp(char *s)
{int i = 0, j = -1, len = strlen(s);b[i] = j;while (i < len){while (j >= 0 && s[i] != s[j]) j = b[j];++i, ++j;b[i] = j;}
}int main()
{while (~scanf(" %s", s) && s[0] != '.'){kmp(s);//字符串长度, 循环节长度int len = strlen(s), len2 = len - b[len];printf("%d\n", len % len2 == 0 ? len / len2 : 1);}
}