字符串相关算法例题

输入一行字符串,该字符串是由一个最小字符串重复N次组成的(N>=1),要求输出N,

包含多行数据,输入为"."时结束,

数据量非常大,题目提示用scanf而非cin输入,题目没有给出字符串长度范围。

字符串P长度m减去P的次长的相同前缀后缀即是最小字符串单元的长度,

用KMP算法求输入字符串P的次长的相同前缀后缀长度ma,

最小字符串单元长度mb=m-ma,输出ans=m / mb,

如果P的次长的相同前缀后缀长度为0,ans=1成立,

题目虽然没有给字符串长度范围,但实测MAXN=10^6够用。

AC-Code (C++)

Time: 125 ms  Memory: 5.6 MB

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;

const int MAXN = 1000005;
int nextt[MAXN];
char p[MAXN];
int m, ma, mb;

void nextt_function(void)
{
	m = strlen(p);
	int j = 0, k = -1;		//nextt[j]=k表示字符串前j个字符的次长的相同前缀后缀长度为k
	nextt[0] = -1;
	while (j < m)
	{
		if (k == -1 || p[j] == p[k])
			nextt[++j] = ++k;
		else
			k = nextt[k];
	}
}


int main(void)
{
	while (scanf("%s", p))
	{
		if (strcmp(p, ".") == 0)
			break;
		nextt_function();
		ma = nextt[m];
		mb = m - ma;
		int ans = 1;
		if (m % mb == 0)		//还没看懂这步的意义,如果不判断会WA
			ans = m / mb;
		printf("%d\n", ans);
	}
	
	return 0;
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值