poj-2046-循环子串问题
来源:互联网 发布:淘宝卖家如何退出村淘 编辑:程序博客网 时间:2024/05/18 14:46
问题
题目:[poj-2046]
思路
这个题目有个结论:
若s存在循环子串,当且仅当,len可以被len - prefix[len-1]整除。连接次数为len / len-prefix[len-1].
充分性我不会证明,我就证明下必要性吧。
不放假设s = pattern * n; len = strlen(s);
显然prefix[ len - 1 ] = pattern*(n-1),这个是最长的公共前缀后缀长度。
那么,循环节的长度为len - prefix[len - 1],也就是len(pattern)。
所以,此时len可以整除len - prefix[len-1].cycle = len - prefix[len-1].
代码
#include <stdio.h>#include <string.h>#define LEN 1000000 + 10char str[LEN];int prefix[LEN];void set_prefix( int n );int main( void ){ while( scanf( "%s", str ), strcmp(str, ".") ){ int ans = 0; int n = strlen(str); set_prefix(n); int cycle = n - prefix[n-1]; if( n % cycle == 0 ) ans = n/cycle; else ans = 1; printf( "%d\n", ans ); } return 0;}void set_prefix( int n ){ prefix[0] = 0; for( int i = 1; i < n; ++i ){ int k = prefix[i-1]; while( k > 0 && str[i] != str[k] ){ k = prefix[k-1]; } if( str[i] == str[k] ) prefix[i] = k + 1; else prefix[i] = 0; }}
阅读全文
0 0
- poj-2046-循环子串问题
- POJ 3693 Maximum repetitionsubstring(后缀数组:循环子串)
- POJ 2406 Power String 最短循环子串
- 1961 2406 poj 求字符串的最小循环子串
- 子窗口问题 死循环
- poj 1017 装箱子问题
- poj 2406 Power Strings 【KMP求最小循环节】【后缀数组求连续重复子串】
- POJ 2406 Power Strings——kmp求最短循环子串
- POJ 2748 推公式循环问题
- pku poj 1050 最大子矩阵问题
- DP 重叠子问题 POJ 3280
- poj 1964 最大子矩阵问题
- poj 2311 (博弈,分解为子问题)
- poj 3061(连续子序列问题)
- 子序列、子串问题
- poj 2744子串 答案
- POJ 3080(子串)
- 关于循环addView子布局监听的问题
- centos 6.5下 安装R语言R-3.3.2失败?
- MOOC清华《面向对象程序设计》第3章编程题第2题:重载下标运算符以统计分段人数
- 线程基础
- Jobdu1201 二叉搜索(排序)树
- C++学习11:向量vector
- poj-2046-循环子串问题
- Linux Socket编程
- Linux下进程间通信概述
- 在着手准备做一个开发项目(web前端),需要做哪些准备?
- 计算机中的定点数和浮点数
- Leet Code OJ 1. Two Sum [Difficulty: Easy]
- MYSQL+vs2010+Navicat基础笔记
- LintCode 解题记录17.8.19 字符串处理6
- (已解决)雷柏v500在Ubuntu系统下键位映射错误