POJ 2406 (KMP,next数组)

本文介绍了一种利用KMP算法中的next数组求解字符串由多少个相同子串构成的方法。通过计算next数组,可以找到字符串s的最小相同子串长度,并据此计算出相同子串的个数。

这道题求的是字符串由几个相同子串构成,正好可以利用kmp算法中的next数组。

next数组标记的是字符串中0 -> i-1  和 1 -> i 的最长公共长度,  设  s = t t t t t t,  next[len] = 5,  这表示 s[0-4]和s[1-5] 的最长公共部分是 5 ,len = 6; 6 - 5 = 1 ,表示 s 的最小相同子串长度 是 1;则 len /(len-next[len])就是相同子串的个数。如果除不尽,则是1;

#include <stdio.h>
#include <string>
#include <string.h>
#include <iostream>
using namespace std;
int next1[1000005];
void get_next(string s){     // 求next数组   next数组会求到第 s.length() 位   next[i] 表示的是 0 - i , 和 i - s.length的最大公共长度   
	next1[0] = -1;             
	int j = -1;
	for(int i=0, len = s.length() ; i<len ;){
		if(j == -1 || s[j] == s[i]){
				++j;
				++i;
			next1[i] = j; 
		}
		else j = next1[j];
	} 
	return ;
} 
int main()
{
	string s;
	while(cin>>s){
		memset(next1,0,sizeof(next1));
		if(s==".") break;
		get_next(s);
		int len = s.length();
		if(len%(len - next1[len]) ==0)
			cout<<len/(len - next1[len]);
		else cout<<1;
		cout<<endl;
	}
	return 0;
} 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值