poj 2406 Power Strings【KMP】
2017-08-15 22:17
399 查看
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.
题意:
给你一段字符串,问你完全重复(没有多余字符)某一字串最多的次数。
思路:
根据最大匹配长度,关键看最后一位匹配的最大长度。前缀和为后缀的最大匹配长度有没重合部分,那就最大为2,一旦中间有其他字符结果就为一,有重合部分时,那就中间就没多余的字符干扰了。
给几组测试数据:
aaabaaab => 2
abcdabc => 1
abcabcab => 1
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.
题意:
给你一段字符串,问你完全重复(没有多余字符)某一字串最多的次数。
思路:
根据最大匹配长度,关键看最后一位匹配的最大长度。前缀和为后缀的最大匹配长度有没重合部分,那就最大为2,一旦中间有其他字符结果就为一,有重合部分时,那就中间就没多余的字符干扰了。
给几组测试数据:
aaabaaab => 2
abcdabc => 1
abcabcab => 1
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #define max_n 1000010 using namespace std; char str1[max_n], str2[max_n]; int f[max_n]; void getnext() { int len = strlen(str2); int i = 0, j = -1; f[0] = -1; while(i < len) { if(j == -1 || str2[j] == str2[i]) f[++i] = ++j; else j = f[j]; } // for(int i = 1; i <= len; i++) { // printf("---%d---\n", f[i]); // } } void solve() { int len = strlen(str2); int res = len - f[len]; if(len % res == 0) printf("%d\n", len / res); else printf("1\n"); } int main() { while(scanf("%s", str2) && str2[0] != '.') { getnext(); solve(); } return 0; }
相关文章推荐
- poj 2406 Power Strings(kmp循环节)
- poj 2406 Power Strings (kmp 中 next 数组的应用||后缀数组)
- poj 2406 Power Strings kmp基础
- poj_2406 Power Strings(KMP求周期子串)
- poj 2406 Power Strings 【KMP】
- poj 2406 Power Strings(KMP)
- poj 2406 Power Strings(KMPnext性质)
- POJ 2406 Power Strings 1961的简化版,kmp的next数组的应用
- POJ 2406 Power Strings--字符串哈希(bkdhash)-KMP(next)
- poj2406--Power Strings(KMP求最小循环节)
- POJ-2406 Power Strings(KMP)
- POJ 2406--Power Strings【KMP】
- [POJ - 2406] Power Strings(KMP)
- poj 2406 Power Strings(KMP)
- POJ 2406 Power Strings(KMP求一个串的重复子串)
- POJ 2406 Power Strings(KMP的应用)
- POJ 2406 Power Strings(KMP求最小循环节)
- [KMP求最小周期]POJ 2406 Power Strings
- POJ-2406(Power Strings)(KMP())
- POJ 2406 Power Strings(kmp)