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: ...
随机推荐
- hdu2222 Keywords Search【AC自动机】
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
- 详解Oracle多种表连接方式
1. 内连接(自然连接) 2. 外连接 (1)左外连接 (左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接(左右两表都不加限制) 3. 自连接(同一张表内的连接) SQL的标准语 ...
- ldapsearch使用
参数 用途 -? 打印关于使用 ldapsearch 的帮助. -a deref 指定别名反向引用.请输入 never.always.search 或 find.如果不使用此参数,缺省为 never. ...
- snowflake and uuid
分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种简单一 ...
- 各种小巧的Hello World
在Reddit看到这篇文章:Hello from a libc-free world! ,觉得挺有趣,然后又想起以前看过的各种相关资料,在此做一个整理.注意所有实验环境都为Linux. 版本一: 实际 ...
- linux系统下添加计划任务执行php文件方法
在web开发过程中,经常需要设定一些定期执行的任务,比如商品定时上下架.我们以php文件为例,讲解linux下的计划任务,来看看吧 在web开发过程中,经常需要设定一些定期执行的任务,比如商品定时 ...
- flask之表单验证 2018.12.23
#flask的消息闪现依赖于flash库,用户发送的请求方式存储在request模块中 #跳转依赖于redirect模块,还可以通过url_for方法来进行方法上的寻址 from flask impo ...
- java读取resource目录下的配置文件
java读取resource目录下的配置文件 1:配置resource目录 下的文件 host: 127.0.0.1 port: 9300 2:读取 / 代表resource目录 InputSt ...
- [na]timewait优化
解决timewait 加入一条socket配置,重用ip和端口 phone=socket(AF_INET,SOCK_STREAM) phone.setsockopt(SOL_SOCKET,SO_REU ...
- [py][mx]django静态文件目录配置
使用TemplateView直接返回html from django.views.generic import TemplateView urlpatterns = [ path('',Templat ...