UVA10298 Power Strings
hash+乘法逆元+一点点数学知识
我们用取余法算出主串的hash,然后从小到大枚举子串的长度
显然,如果若干个子串的复制的hash值之和等于主串的hash值,那么答案就得到了。
然后我们计算子串(设子串长度为 i )的hash值:
hash=t*(+base^i+base^2i+...+base^(len-i))
如果直接暴力求,那么显然会TLE
于是我们进行推导:
设:
Si=+base^i+base^2i+...+base^(len-i)
S=Si*(base^i)=base^i+base^2i+base^3i+...+base^len
所以
S-Si=base^len-=Si*(base^i-)
Si=(base^len-)/(base^i-)
我们利用快速幂可以很快地得出结果
但是涉及到取模除法运算,所以我们可以用乘法逆元,这里不详细讲了
根据费马小定理,base^i-1关于mod的乘法逆元为 (base^i-1)^(mod-2)
end.
然鹅更常用的判断循环子串方法在这里:point_here(本题升级版)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef unsigned long long ull;
const int mod=1e9+;
const int base=;
char c[];
inline ull ksm(int x,int y){ //快速幂
ull ans=;
for(;y;y>>=){
if(y&) ans=ans*(ull)x%mod;
x=1LL*x*x%mod;
}
return ans%mod;
}
int main(){
do{
scanf("%s",c);
if(c[]=='.') return ;
int ans=,len=strlen(c);
ull tot=,t=;
for(int i=;i<len;++i) tot=(tot*base+(ull)c[i])%mod; //计算主串hash值
for(int i=;i<=len/;++i){
t=(t*base+(ull)c[i-])%mod; //子串hash值
if(len%i) continue; //子串长度不被整除不可能有解
ull tmp=ksm(base,i)-;
ull s=(ksm(base,len)-)*ksm(tmp,mod-)%mod;
if(t*s%mod==tot){ //刚好可以填充
ans=len/i; break;
}
}
printf("%d\n",ans);
}while();
}
UVA10298 Power Strings的更多相关文章
- UVA10298 Power Strings [KMP]
题目传送门 Power Strings 格式难调,题面就不放了. 一句话题意,求给定的若干字符串的最短循环节循环次数. 输入样例#1: abcd aaaa ababab . 输出样例#1: 1 4 3 ...
- 洛谷 UVA10298 Power Strings 题解
Analysis 结论:设字符串长度为n,最长相同前后缀的长度为kmp[i],如n%(n-kmp[n])=0,则答案为n/(n-kmp[n]),否则为1. 如果循环节多于一个,以前n-kmp[n]个为 ...
- 「UVA10298」 Power Strings(KMP
题目描述 PDF 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 复制 abcd aaaa ababab . 输出样例#1: 复制 1 4 3 题解 Luogu的题解 这里是对目前 ...
- POJ 2406 Power Strings (KMP)
Power Strings Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 29663Accepted: 12387 Descrip ...
- POJ 2406 Power Strings
F - Power Strings Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u S ...
- poj 2406:Power Strings(KMP算法,next[]数组的理解)
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 30069 Accepted: 12553 D ...
- POJ 2406:Power Strings
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 41252 Accepted: 17152 D ...
- E - Power Strings,求最小周期串
E - Power Strings Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u S ...
- poj 2406 Power Strings kmp算法
点击打开链接 Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 27368 Accepted: ...
随机推荐
- R数据可视化手册学习简单的绘制常见的图形
1.绘制散点图 # 使用ggplot2 library(ggplot2) ggplot(data = mtcars, aes(x = wt, y = mpg)) + geom_point() 2.绘制 ...
- Oracle安装部署之RedHat安装Oracle11g_R2
硬件配置 内存 :≥1G 硬盘空间:≥10G 上传oracle11g安装包: putty上用wcw用户登录,通过ftp服务上传oracle安装文件到/home/wcw目录下解压 #unzip linu ...
- iOS-动画之CoreAnimation框架(转载)
一.简介 iOS动画主要是指Core Animation框架.官方使用文档地址为:Core Animation Guide.Core Animation是iOS和macOS平台上负责图形渲染与动画的基 ...
- Tunnel Warfare--- hdu1540 线段树求连续子区间
题目链接 题意:有n个村庄,编号分别为1-n:由于战争会破坏村庄,但是我们也会修复: D x代表村庄x被破坏: Q x是求与x相连的有几个没有被破坏: R 是修复最后一次被破坏的村庄: 接下来有m个操 ...
- ChinaTest测试感悟
这次去北京参加ChinaTest大会,听了各位大师和同行的心得和感悟,收获颇多.很喜欢这样的大会,可以听到测试的各种声音各种观点.当没有对错时,需要思考的就是怎样采取最适合当前环境的策略.言归正传,谈 ...
- SpringBoot @Transactional声明事务无效问题
查看系统支持的存储引擎:show engines; 查看表使用的引擎:show table status from db_name where name='table_name'; 修改表引擎方法: ...
- property:get、set
property属性:自动调用get.set方法 每次调用隐藏的数据,都用get和set方法写的字符太长,就用property解决. 方法一:使用property()函数升级get.set方法 源 ...
- jquery css样式
1.单一样式 $('.list li').css( "float", "none"); 2. 多个样式 $('.list li').css( { ...
- python len() 函数
Python len() Python len() 方法返回对象(字符.列表.元组等)长度或项目个数. len(obj) 方法语法 obj -- 对象(字符串.列表.元组.字典等) 字符串长度 > ...
- 登录mysql出现/var/lib/mysql/mysql.sock不存在
问题描述: 1.mysql安装完成后,使用 service mysqld start 总是出现 start failed. 2.使用mysql -uroot -p登录出现找不到 /var/lib/my ...