[洛谷]UVA10298 Power Strings

博客详细介绍了如何解决UVA10298问题,探讨了通过重复子串构造字符串的特性,并利用next数组(KMP算法的一部分)来找出最小重复子串。文章提供了输入输出样例并解释了字符串长度限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接:https://www.luogu.com.cn/problem/UVA10298

[原题]

题目描述

PDF

输入格式

输出格式

题意翻译

题意简述:

求一个字符串由多少个重复的子串连接而成。

例如 ababab 由三个 ab 连接而成,abcd 由 abcd 由一个 abcd 连接而成。

输入格式

本题多组数据

每一组数据仅有一行,这一行仅有一个字符串 ss。

输入的结束标志为一个 .

输出格式

对于每一组数据,输出这组字符串由多少个重复的子串连接而成。

说明/提示

1\le |s|\le 10^61≤∣s∣≤106。

输入输出样例

输入 #1复制

abcd
aaaa
ababab
.

输出 #1复制

1
4
3

[题解]

首先我们一下一些可以通过重复字串构成的字符串的特点.

abcdabcdabcd aaaaaaaaa ababababab

然后相对应写出这些字符串里面的next数组(就是KMP算法中的next数组), 观察一下有什么特点.

000012345678 012345678 0012345678

我们会发现这种字符串其实除了前面有几个0以外后面是每次加1的, 前面的几个0就是我们需要寻找的重复字串.

为什么呢?

我们这样想.如果一个字符串是通过重复字符串的话, 字符串的next[n] ~  n 和 0 ~ next[N] 字符串 一定相同, 并且, 

n - next[n]就是最小的重复字串.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值