Power Strings

文章介绍了一种利用哈希值判断字符串中重复子串的方法,通过计算字符串的哈希数组并在循环中检查是否存在特定长度的重复模式。代码示例展示了如何实现这个算法,包括初始化哈希、检查函数以及主程序的逻辑。文章强调了代码的优雅和巧妙之处。
摘要由CSDN通过智能技术生成

Power Strings

题面翻译

题意简述:

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

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

输入格式

本题多组数据

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

输入的结束标志为一个 .

输出格式

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

说明/提示

1 ≤ ∣ s ∣ ≤ 1 0 6 1\le |s|\le 10^6 1s106

题目描述

PDF

输入格式

输出格式

样例 #1

样例输入 #1

abcd
aaaa
ababab
.

样例输出 #1

1
4
3

读题

采用hash做法,通过哈希值来判断字符串中是否存在重复子串,并求出重复子串的个数。

此题较优秀,笔者在此想分为两部分来谈论,具体分为总览分析,当然,在阅读后有兴趣的读者可以通过网络,查阅相关资料(比如蓝书–《算法竞赛入门经典·训练指南》)。

1.总览

根据题目,很容易想到:

  1. 读入一个字符串,存储在数组 aa 中,作为主串。
  2. 检查是否为结束标志,即字符串以句号 '.' 开头。如果是,则退出程序;否则继续执行后续步骤。
  3. 计算输入字符串 aa 的长度,存储在变量 n 中。
  4. 初始化哈希数组 h,数组大小设为 M
  5. 计算哈希数组 h,其中 h[i] 表示字符串 aa 的前缀子串 aa[1...i] 的哈希值。
  6. 进入循环遍历,枚举每个可能的重复模式长度 i
  7. 判断当前长度 i 是否能整除字符串长度 n,如果不能,则继续下一次循环。
  8. 计算模式串的哈希值 s,即子串 aa[1...i] 的哈希值。
  9. 调用 check 函数,检查字符串是否存在长度为 i 的重复模式。check 函数使用哈希值进行匹配判断。
  10. 如果存在重复模式,则输出重复模式的个数,即字符串长度除以重复模式长度。
  11. 回到第 5 步,继续处理下一个输入字符串。

代码

#include<bits/stdc++.h>
using namespace std;
const int x=1311,M=1e7;
int a[M],b[M],h[M],f=0;
char aa[M],bb[M];
int n,s;
bool init(){
   
	scanf("%s",aa+
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值