POJ2406 KMP前缀周期
2014-06-01 17:16
274 查看
题意:
给你一个字符串,长度小于1百万,问你他最多可以拆成集合相同字符串,例如abcabcabc 可以拆成3个abc,所以输出3.
思路:
这个是比较常规的next应用,首先假设当前字符串长度n;那么
n - next
前缀为最短子串长度,如果n - next
!= 0 && n / (n - next
) == 0,说明最后一个字符串是长度(n - next
)子串的最后一位,那么直接输出n/(n-next
)就行了,否则不是最后一位,输出1 ,例如abcab 最后n - next
应该等于3,说明最短子串是3,而5 % 3 == 2,说明最后一个是子串中的第二个,不能做到完全循环,所以要输出1
给你一个字符串,长度小于1百万,问你他最多可以拆成集合相同字符串,例如abcabcabc 可以拆成3个abc,所以输出3.
思路:
这个是比较常规的next应用,首先假设当前字符串长度n;那么
n - next
前缀为最短子串长度,如果n - next
!= 0 && n / (n - next
) == 0,说明最后一个字符串是长度(n - next
)子串的最后一位,那么直接输出n/(n-next
)就行了,否则不是最后一位,输出1 ,例如abcab 最后n - next
应该等于3,说明最短子串是3,而5 % 3 == 2,说明最后一个是子串中的第二个,不能做到完全循环,所以要输出1
#include<stdio.h> #include<string.h> int next[1000005]; char str[1000005]; void get_next(int m) { int j ,k; j = 0 ,k = -1; next[0] = -1; while(j < m) { if(k == -1 || str[j] == str[k]) next[++j] = ++k; else k = next[k]; } } int main () { int n; while(~scanf("%s" ,str) && str[0] != '.') { n = strlen(str); get_next(n); //printf("%d\n" ,n - next ); if(n % (n - next[n]) == 0) printf("%d\n" ,n / (n - next[n])); else printf("1\n"); } return 0; }
相关文章推荐
- POJ 2406 Power Strings(KMP找周期)
- poj2406--Power Strings+KMP求周期
- poj 2406 KMP求周期
- poj 2406 poj 1961 个人对吉大KMP模板的理解 KMP 基础题--找周期串
- POJ 2406(KMP求最小周期)
- poj_2406 Power Strings(KMP求周期子串)
- POJ 2406 Power Strings (kmp求周期)
- [KMP求最小周期]POJ 2406 Power Strings
- poj 2406 KMP求周期数
- POJ 2406 Power Strings KMP求周期
- POJ 2406 Power Strings KMP求周期
- poj_2406 kmp
- POJ 2752 Seek the Name, Seekthe Fame(KMP:后缀与前缀)
- poj 2406 Power Strings(KMP)
- POJ 2406 KMP 循环节
- POJ 2406 Power Strings KMP运用题解
- poj(2406)求最短重复子串-KMP
- Power Strings (poj 2406 KMP)
- poj 2406 Power Strings (kmp 中 next 数组的应用||后缀数组)
- POJ 2752 既是前缀又是后缀的子串 (kmp)