题目
有一个口吃的外星人,说的话里包含很多重复的字符串,比如babab包含两个bab。给出这个外星人说的一句话,找出至少出现m次的最长字符串。
输入:
输入包含多组数据。每组数据第一行为整数m,第二行为一个仅包含小写字母的字符串,长度在m~40000之间。输入结束博阿直为m=0。
输出:
对于每组数据,如果不存在,则输出'none',否则输出两个整数,即最长字符串的长度及其起始位置的最大值。
样例输入:
3
baaaababababbababbab
11
baaaababababbababbab
3
cccccc
0
样例输出:
5 12
none
4 2
分析
一、
首先想到的是应该是暴力程序;
枚举串的长度,再进行验证,暴力生成所有该长度的子串匹配看是否在原串中出现过至少n次。
时间复杂度应为O(len^4)?(len 为 原串长度)
枚举长度 len 次运算,生成子串 len次运算 暴力匹配 len^2 次运算。
时间复杂度太高了,,肯定是没有能力通过40000的规模的
所以尝试怎么去优化算法。
二、
由于这是我们正在讲的例题,所以说我直接介绍运用 字符串hash 表 的做法。
和hash表 类似,将字符进行编码转译储存在hash 表中,
二分猜出 子串 长度len,, 建立所有长度为len 的 字符串 的hash 表
如果两个串对应的 hash 值相等,认为两字符串相等
PS:做题时卡了好久,,在计算hash值时,所选的乘方底数应该 尽量去选择一个素数。
这里直接附上我认为解释的比较清楚的网址,留作参考。
点击打开链接
点击打开链接
类似的,我在做题时选择使用 ull 让它自然溢出,
如果是 要 模 一个值 , 也尽量选择一个大质数
总体思路如上,代码附下
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include