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;
} 


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

kmp求最小循环节

KMP最小循环节、循环周期: 定理:假设S的长度为len,则S存在最小循环节,循环节的长度L为len-next[len],子串为S[0…len-next[len]-1]。 (1)如果len...
  • hao_zong_yin
  • hao_zong_yin
  • 2017年08月21日 19:19
  • 229

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

KMP中next数组用于求最小循环节的应用 之前不知道next还有这个
  • u011639256
  • u011639256
  • 2014年08月14日 16:10
  • 1296

KMP算法求字符串的最小循环节

题目链接(题目链接) 说到求字符串的最小循环节就不得不提及KMP算法 因为要求循环节,还需要用到KMP算法的next数组 KMP算法本来是用来求一个串中是否包含另一个串,或者说一个串是否为...
  • wjhshuai
  • wjhshuai
  • 2017年07月08日 11:38
  • 414

kmp最小循环节的求法

其实我一直都没有理解严老师的数据结构中对于next函数求法中的一句话 next 函数求值可以看作是串的模式匹配问题,这句话我一直我不是很理解,我一直把它的过程理解为一个动态规划的过程(有兴趣的话可以参...
  • u013060011
  • u013060011
  • 2014年02月11日 21:32
  • 1636

笔试题——输出循环小数的循环节

求一个分数对应小数的循环节。、思路:我们分别用x和y表示分子和分母,先求出整数部分x div y和余数部分x mod y,那么小数部分就是重复将余数部分乘以10再进行整除运算和求余运算,直到出现循环或...
  • wensishuai
  • wensishuai
  • 2011年05月12日 20:24
  • 4283

5.1.3(求最小循环节)

就是一个暴力求最小循环节的题目,还是比较简单的吧. 贴出代码: #include #include #include #include using namespace std; in...
  • qinaide_lixiaoshuo
  • qinaide_lixiaoshuo
  • 2013年03月04日 21:20
  • 511

Period--KMP,最小循环节

Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 16597   Accept...
  • bless924295
  • bless924295
  • 2016年08月25日 20:48
  • 130

数据结构——求循环节

void change( int n, int m, NODE * head ) { int already_have[10000]={0}; int i,i_1,judge[1000...
  • begin_hunter
  • begin_hunter
  • 2012年11月16日 14:55
  • 373

HDU3746KMP求最小循环节

Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)...
  • xujixuji123
  • xujixuji123
  • 2014年06月30日 14:48
  • 315

递推式求循环节的方法

大致说下递推式循环节的解决方案: problem: f(n)=a*f(n-1)+b*f(n-2),求f(n)%p的循环节 solution:  1.对p进行质因数分解,p = p1^a1 * p...
  • u013790563
  • u013790563
  • 2015年05月10日 20:26
  • 736
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ-2406-kmp求最小循环节
举报原因:
原因补充:

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