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. pycurl实例详解

    Pycurl是Python的libcurl接口.liburl是客户端的URL传输库,它支持FTP,FTPS,HTTP,HTTPS,TELNET,LDAP等诸多协议,同时支持HTTP认证,代理,FTP上 ...

  2. OC中分类(Category)和扩展(Extension)

    1.分类的定义 category是Objective-C 2.0之后添加的语言特性,中文也有人称之为分类.类别.Category的主要作用是为已经存在的类添加方法.这个大家可能用过很多,如自己给UIC ...

  3. $w=$mysqli->query($sql);

    $db = new mysqli('localhost', 'root', '', 'w'); if($db->connect_error){ die('Connect Error ( '.$d ...

  4. ElasticSearch报 EsThreadPoolExecutor[search, queue capacity = 1000, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@c0efba

    ElasticSearch报以下错误的解决办法: "type": "es_rejected_execution_exception", "reason ...

  5. netcat/curl/wget/smb/icmp ping -p/dns/telnet

    通过SMB协议,在目标服务器和主机之间建立网络共享连接,然后将目标服务器上的文件做分享,接着就可以在主机端将分享的文件copy下来啦.操作的命令如下, net use h: \\xxx.xxx.xxx ...

  6. Zero-Copy技术

    概述 考虑这样一种常用的情形:你需要将静态内容(类似图片.文件)展示给用户.那么这个情形就意味着你需要先将静态内容从磁盘中拷贝出来放到一个内存buf中,然后将这个buf通过socket传输给用户,进而 ...

  7. React-生命周期的相关介绍

    1.mounting/组件插入相关 (1)componentWillMount  模板插入前 (2)render 模板插入 (3)componentDidMount 模板插入后 2.Updating/ ...

  8. Mirror--如何TSQL查看镜像状态和镜像相关存储过程

    --==================================================== --查看镜像状态 SELECT DB_NAME(database_id) AS Datab ...

  9. Mysql技术内幕——InnoDB存储引擎

    Mysql技术内幕——InnoDB存储引擎 http://jingyan.baidu.com/article/fedf07377c493f35ac89770c.html 一.mysql体系结构和存储引 ...

  10. linux 常用清理或备份文件命令

    find /data/tmp/confluence/backups/ -type f -mtime +7 -exec rm -f {} \; ##查找创建超过7天的文件并强制删除 cp /data/a ...