POJ-2406-kmp求最小循环节

原创 2015年11月18日 17:54:42

http://poj.org/problem?id=2406

求一个字符串最多由多少个子串重复得到,用kmp里求next数组的方法求得最后一个字母的next【】

如果 next[n]指向的位置的字符与自身相等,且 len%(n-next[n])==0 ,则可证明 字符串存在  len/(n-next[n])个循环节,不满足任一条件,循环节长度只能为1


证明见 :http://blog.csdn.net/viphong/article/details/48498595


#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <queue>
#include <set>
#include <vector>
#define  inf 0x7fffffff
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const int maxn = 1000005;
using namespace std;

int nextval[maxn];
void get_next(char *t,int len)	//失配函数

{
	int i,j;
	i=1; 
	nextval[1]=0;
	j=0;
	while(i<len)
	{
		
		if (j==0||t[i]==t[j])
		{ 
			j++;
			i++;  
		//	if (t[i]!=t[j])
			nextval[i]=j;
		//	else
		//		nextval[i]=nextval[j];
			
			
		}
		else
			j=nextval[j];
	}
	
}
 
char tm[maxn];  //主串
char nm[maxn];

int judge(int x)
{
return 0;
}
int main( )
{    
 
	while(scanf("%s",tm+1)!=EOF)
	{
		if (strcmp(tm+1,".")==0) break;
		int len=strlen(tm+1);
		get_next(tm,len);
		int maxx=nextval[len];
		int ans;
		if (len%(len-maxx)==0&& tm[len]==tm[nextval[len]]) 
			ans=len/(len-maxx);
		else
			ans=1;
 
			printf("%d\n",ans);
	
	
	}
	return 0;
} 


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Period POJ - 1961(kmp求最大周期,最小循环节)

For each prefix of a given string S with N characters (each character has an ASCII code between 97 a...

POJ 1961 Period KMP 最小循环节

Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 11771   Accept...
  • kdwycz
  • kdwycz
  • 2014年01月20日 08:39
  • 458

poj2406--Power Strings+KMP求周期

先把结论摆出来:对于长为j的字符串str[1..j],next[j]=k,则令d=j-k;如果j%d==0,则这个字符串是一个 周期串,前d个字符是其最小的循环结,共包含j/d个循环节。 现在来解...
  • acm_lkl
  • acm_lkl
  • 2015年02月07日 15:49
  • 433

数据结构:KMP next数组求串最小循环节、循环周期

KMP中next数组用于求最小循环节的应用 之前不知道next还有这个

POJ2406_Power Strings_KMP_求最短重复子序列

这道题跟POJ1961非常像,比那道还简单些,只需要求整个串就行,而1961需要求所有长度的。 题意是: 给一个串,求该串可以最多被一个子串重复多少次形成 比如abcabcabcabc,ans=4 ...

poj 2406 Power Strings(KMP求循环次数)

poj 2406 Power Strings(KMP求循环次数)

kmp的next数组的运用(求字符串的最小循环节)

hdu3746

poj 1721 CARDS 【置换群 】【求最小循环节 再由末序列 求 初序列】

CARDS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1516   Accepted...

【字符串入门专题1】D - Period hdu 1358【kmp-最小循环节简单应用】

Period Problem Description For each prefix of a given string S with N characters (each c...

poj 1961 2406 让你彻底理解KMP的next[]数组的两个题目

两题运用kmp思路基本上是一样的,都是从头开始找相同前缀的   运用next数组原理,让你充分理解,即使不理解,你也记住了,哈哈 poj 2406 Power Strings...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ-2406-kmp求最小循环节
举报原因:
原因补充:

(最多只允许输入30个字)