kmp優化過的求next的方法不能直接用 優化
Power Strings
Description spa
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 .net
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 code
For each s you should print the largest n such that s = a^n for some string a.
Sample Input orm abcd aaaa ababab . Sample Output ip 1 4 3 Hint ci
This problem has huge input, use scanf instead of cin to avoid time limit exceed.
Source 字符串 |
[Submit] [Go Back] [Status] [Discuss] get
/*============================================================================= # FileName: 2406.cpp # Desc: poj 2406 # Author: zhuting # Email: cnjs.zhuting@gmail.com # HomePage: my.oschina.net/locusxt # Version: 0.0.1 # CreatTime: 2013-12-21 14:45:54 # LastChange: 2013-12-21 14:45:54 # History: =============================================================================*/ #include <cstdio> #include <cstdlib> #include <string> #include <cstring> #include <algorithm> #define maxn 1000010 char str[maxn]; /*直接用優化過的求next方法無法解這道題*/ int* get_next(char* a) { int len = strlen(a); if (len <= 0) return NULL; int j = 0, k = -1; int* n = new int[len + 1];/*n[len+1]記錄以a[0]開頭與a[len-1]結尾的等長相同的字符串的最長長度*/ n[0] = -1; while(j < len) { if (k >= 0 && a[k] != a[j]) { k = n[k]; } ++j; ++k; n[j] = k; } return n; } int main() { while(scanf("%s", str) != EOF) { if (str[0] == '.') break; int len = strlen(str); int* tmp = get_next(str); int delta = len - tmp[len]; if (len % delta || str[len - 1] != str[tmp[len] - 1])/*特別注意aaab這種狀況*/ printf("1\n"); else printf("%d\n", len / delta); /*test*/ /* for (int i = 0; i <= len; ++i) { printf("%d ", tmp[i]); } printf("\n");*/ } return 0; }