类似于2406,只是对字符串的每一前缀都要判断一次,参看2046 Power Strings。题意:给一个字符串S长度不超过10^6,对S的每个子串str求最大的n使得str由n个相同的字符串a连接而成,如:"ababab"则由n=3个"ab"连接而成,"aaaa"由n=4个"a"连接而成,"abcd"则由n=1个"abcd"连接而成。
定理:假设S的长度为len,则S存在循环子串,当且仅当,len可以被len - next[len]整除,最短循环子串为S[len - next[len]]
例子证明:设S=q1q2q3q4q5q6q7q8,并设next[8] = 6,此时str = S[len - next[len]] = q1q2,由字符串特征向量next的定义可知,q1q2q3q4q5q6 = q3q4q5q6q7q8,即有q1q2=q3q4,q3q4=q5q6,q5q6=q7q8,即q1q2为循环子串,且易知为最短循环子串。由以上过程可知,若len可以被len - next[len]整除,则S存在循环子串,否则不存在。
解法:利用KMP算法,求字符串的特征向量next,若len可以被len - next[len]整除,则最大循环次数n为len/(len - next[len])。对字符串的每一个前缀子串都进行一次判断。
posted on 2010-05-19 01:46 David Liu 阅读(337) 评论(0) 编辑 收藏 引用 所属分类: 字符串
Powered by: C++博客 Copyright © David Liu