利用KMP算法的预处理部分。 /*Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 15324 Accepted: 6475 Description Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiation by a non-negative integer is defined in the normal way: a^0 = "" (the empty string) and a^(n+1) = a*(a^n). Input Each test case is a line of input representing s, a string of printable characters. The length of s will be at least 1 and will not exceed 1 million characters. A line containing a period follows the last test case. Output For each s you should print the largest n such that s = a^n for some string a. Sample Input abcd aaaa ababab . Sample Output 1 4 3 Hint This problem has huge input, use scanf instead of cin to avoid time limit exceed.*/ #include <stdio.h> #include <string.h> #define MAX_STRING_LENGTH 1000005 int gaiNext[MAX_STRING_LENGTH]; char gacInputBuffer[MAX_STRING_LENGTH]; void KMP_CalcNext(char *vpcInputPattern) { int iPatternLen = 0; int iLoop = 0; int iNextIndex = -1; iPatternLen = strlen(vpcInputPattern); gaiNext[0] = -1; for (iLoop = 0; iLoop < iPatternLen; iLoop++) { while(0 <= iNextIndex && vpcInputPattern[iNextIndex] != vpcInputPattern[iLoop]) { iNextIndex = gaiNext[iNextIndex]; } if (0 > iNextIndex ||vpcInputPattern[iNextIndex] == vpcInputPattern[iLoop]) { iNextIndex++; gaiNext[iLoop+1] = iNextIndex; } } return; } // void KMP_CalcNext(char *vpcInputPattern) // { // int iPatternLen = 0; // int iLoop = 0; // int iNextIndex = -1; // // // iPatternLen = strlen(vpcInputPattern); // // gaiNext[0] = -1; // // while(iLoop < iPatternLen) // { // if(iNextIndex == -1||vpcInputPattern[iLoop] == vpcInputPattern[iNextIndex]) // { // iLoop++; // iNextIndex++; // gaiNext[iLoop] = iNextIndex; // }else // { // iNextIndex = gaiNext[iNextIndex]; // } // } // // return; // } int PowerStringsMain() { int iStrLen = 0; while (1) { scanf("%s",gacInputBuffer); if ('.' == gacInputBuffer[0]) { break; } iStrLen = strlen(gacInputBuffer); KMP_CalcNext(gacInputBuffer); if (0 != iStrLen%(iStrLen - gaiNext[iStrLen])) { printf("1/n"); } else { printf("%d/n",iStrLen/(iStrLen - gaiNext[iStrLen])); } } return 0; }