Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1442 Accepted Submission(s): 645
abcder aaaaaa ababab
1 1 6 1 1 6 1 6 1 3 2 3
#include <stdio.h> #include <string.h> #define maxn 1000002 char str[maxn]; int len, next[maxn]; void getNext(){ int i = 0, j = -1; next[0] = -1; while(i < len){ if(j == -1 || str[i] == str[j]){ ++i; ++j; next[i] = j; }else j = next[j]; } } int minR(){ int i = 0, j = 1, k = 0, t; while(i < len && j < len && k < len){ t = str[i+k >= len ? i+k-len : i+k] - str[j+k >= len ? j+k-len : j+k]; if(t == 0) ++k; else{ if(t > 0) i += k + 1; else j += k + 1; k = 0; if(i == j) ++j; } } return i < j ? i : j; } int maxR(){ int i = 0, j = 1, k = 0, t; while(i < len && j < len && k < len){ t = str[i+k >= len ? i+k-len : i+k] - str[j+k >= len ? j+k-len : j+k]; if(t == 0) ++k; else{ if(t > 0) j += k + 1; else i += k + 1; k = 0; if(i == j) ++j; } } return i < j ? i : j; } int main(){ int minlen, num; while(scanf("%s", str) == 1){ len = strlen(str); getNext(); if(len % (len - next[len]) == 0) //最小循环节点 minlen = len - next[len]; else minlen = len; num = len / minlen; printf("%d %d %d %d\n", minR()+1, num, maxR()+1, num); } return 0; }
HDOJ3374 String Problem [KMP最小循环节点]+[最小(大)表示法],布布扣,bubuko.com
HDOJ3374 String Problem [KMP最小循环节点]+[最小(大)表示法]
原文:http://blog.csdn.net/chang_mu/article/details/24929077