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的更多相关文章

  1. UVA10298 Power Strings [KMP]

    题目传送门 Power Strings 格式难调,题面就不放了. 一句话题意,求给定的若干字符串的最短循环节循环次数. 输入样例#1: abcd aaaa ababab . 输出样例#1: 1 4 3 ...

  2. 洛谷 UVA10298 Power Strings 题解

    Analysis 结论:设字符串长度为n,最长相同前后缀的长度为kmp[i],如n%(n-kmp[n])=0,则答案为n/(n-kmp[n]),否则为1. 如果循环节多于一个,以前n-kmp[n]个为 ...

  3. 「UVA10298」 Power Strings(KMP

    题目描述 PDF 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 复制 abcd aaaa ababab . 输出样例#1: 复制 1 4 3 题解 Luogu的题解 这里是对目前 ...

  4. POJ 2406 Power Strings (KMP)

    Power Strings Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 29663Accepted: 12387 Descrip ...

  5. POJ 2406 Power Strings

    F - Power Strings Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u S ...

  6. poj 2406:Power Strings(KMP算法,next[]数组的理解)

    Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 30069   Accepted: 12553 D ...

  7. POJ 2406:Power Strings

    Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 41252   Accepted: 17152 D ...

  8. E - Power Strings,求最小周期串

    E - Power Strings Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u S ...

  9. poj 2406 Power Strings kmp算法

    点击打开链接 Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 27368   Accepted:  ...

随机推荐

  1. java.sql.SQLException:The Network Adapter could not establish the connection

    数据库连不上了,可能数据断了或者修改IP了

  2. 查找算法:二分法查找及其python实现案例

    承接上一篇:查找:顺序查找与二分法查找,将二分法更多详细的python实现解题写下笔记. 简单方法 ''' 二分法查找在列表中的用户输入值,返回index 三种情况跳出循环体: LR相邻 LR位置重合 ...

  3. 学习计划 mysql 用户管理与权限

    最近在学习数据库的 主从复制 里面涉及到了关于用户及其管理权限的赋予,之前一直没有认真的学习这个. 现在想具体的学习一下. -- 为什么 数据库 要实现多用户管理? 举个最简单的例子,你需要和第三方做 ...

  4. HTML5 桌面提示

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  5. post方式提交数据

    <!DOCTYPE HTML><html>    <head>        <meta charset="utf-8" />   ...

  6. decltype类型声明- 现代C++新特性总结

    decltype类型声明 有时会遇到这样的情况:希望从表达式的类型推断出要定义的变量的类型,但不想用该表达式的值去初始化变量.为了满足这一需求,C++11引入了decltype,它的作用是选择并返回操 ...

  7. spring boot 自定义过滤器链

    spring boot 会按照order值的大小,从大到小的顺序来依次过滤. 贴下代码: package com.osp.ucenter; import org.springframework.boo ...

  8. hdu3339In Action(最短路+01背包)

    http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=259#problem/H Description Since 1945, whe ...

  9. 第22章 CLR寄宿和AppDomain

    22.1 CLR寄宿 CLR Hosting(CLR 宿主)的概念:初始启动.Net Application时,Windows进程的执行和初始化跟传统的Win32程序是一样的,执行的还是非托管代码,只 ...

  10. SVM计算过程,对偶形式,核函数

    SVM是一个分类方法,用w^X+b定义分类函数, 于是求w.b,为寻最大间隔,引出1/2||w||^2,继而引入拉格朗日因子,化为对单一因数对偶变量a的求解(求解过程中会涉及到一系列最优化或凸二 次规 ...