【题解】Power Strings
题目描述
给定若干个长度小于等于10^6的字符串,询问每个字符串最多由多少个相同的子串重复连接而成。如:ababab,最多由3个ab连接而成。
输入输出格式
输入格式
若干行,每行一个字符串。
当读入到“.”时结束程序。
输出格式
若干行,为对应的答案。
输入输出样例
输入样例
abcd
aaaa
ababab
.
输出样例
1
4
3
题解
这道题可以用字符串hash或kmp来做。
主要就是要将这道题转换成求最长前缀满足同为后缀。
假设在s[1...n]中,s[1...i]为前缀且s[n-i+1...n]为后缀,那么当i>=n-i+1时,s[1...n-i]=s[n-i+1...n-i+1+n-i]=...=s[i+1][n],继续推下去,可以证得当i|n时,i就是其中相同子串中的一个,求出最长的i即可得出结果。
#include <cstdio>
#include <cstring> #define MAX_N 1000000 using namespace std; int n;
const unsigned long long b = ;
char s[MAX_N | ];
unsigned long long p[MAX_N | ], h[MAX_N | ]; int main()
{
p[] = ;
for(register int i = ; i < MAX_N; ++i)
{
p[i] = p[i - ] * b;
}
int op;
while(scanf("%s", s))
{
op = ;
n = strlen(s);
if(n == && s[] == '.') break;
h[] = s[];
for(register int i = ; i < n; ++i)
{
h[i] = h[i - ] * b + s[i];
}
for(register int i = ; i < n; ++i)
{
if(h[n - i - ] == h[n - ] - h[i - ] * p[n - i])
{
if(n % i) continue;
printf("%d\n", n / i);
op = ;
break;
}
}
if(!op) printf("1\n");
}
return ;
}
参考程序(字符串hash)
#include <cstdio>
#include <cstring> #define MAX_N 1000000 using namespace std; int n;
char a[MAX_N | ];
int p[MAX_N | ]; int main()
{
while(scanf("%s", a) && (a[] ^ '.'))
{
n = strlen(a);
p[] = -;
for(register int i = , j = -; i + < n; ++i)
{
while(j >= && (a[i + ] ^ a[j + ])) j = p[j];
if(a[i + ] == a[j + ]) ++j;
p[i + ] = j;
}
if(n % (n - p[n - ] - )) printf("1\n");
else printf("%d\n", n / (n - p[n - ] - ));
}
return ;
}
参考程序(kmp)
【题解】Power Strings的更多相关文章
- Power Strings[poj2406]题解
Power Strings Description - Given two strings a and b we define ab to be their concatenation. For ex ...
- Power Strings(kmp妙解)
Power Strings Time Limit : 6000/3000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Tota ...
- 「UVA10298」 Power Strings(KMP
题目描述 PDF 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 复制 abcd aaaa ababab . 输出样例#1: 复制 1 4 3 题解 Luogu的题解 这里是对目前 ...
- poj2406 Power Strings (kmp 求最小循环字串)
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 47748 Accepted: 19902 ...
- 【poj 2406】Power Strings 后缀数组DC3模板 【连续重复子串】
Power Strings 题意 给出一个字符串s,求s最多由几个相同的字符串重复而成(最小循环节的重复次数) 思路 之前学习KMP的时候做过. 我的思路是:枚举字符串的长度,对于当前长度k,判断\( ...
- 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 ...
随机推荐
- (转)Centos7 修改硬件时间和系统时间
查看硬件时间 [root@localhost ~]# hwclock --show Tue 13 Jun 2017 02:11:12 AM CST -0.848845 seconds 1 2 可以看出 ...
- abp 修改abp.zero的实体映射类,使生成的表和字段为大写状态
在我们项目中,由于涉及到报表配置管理,可以通过一段sql快捷的配置出一个报表页面.部分sql会与abp框架的一些系统表做关联查询,而abp的映射类没有单独设置表和字段的名称,默认用类名和属性名,区分大 ...
- odoo方法
一. 类似于前面有个_ 的方法,格式是如下def _getdlvqty(self, cr, uid, ids, field_names, args, context=None): def _get_p ...
- ABC Tech Day(2018.08.11)
时间:2018.07.24地点:北京中关村创业大街车库咖啡
- 大数据入门第二十天——scala入门(一)入门与配置
一.概述 1.什么是scala Scala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性.Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序. ...
- Luogu P1993 小 K 的农场
其实很早以前就打好了,但一直忘记写了. 也就是差分约束的模板题. 关于差分约束,也就是用来求关于一些不等式互相约束算出最优解. 推荐一个讲的很好的博客:http://www.cppblog.com/m ...
- Luogu P1726 上白泽慧音
这显然是一道求强连通分量(SCC)的题目. 只要你正常,都知道应该写Tarjan. 然后(假装会写Tarjan),其实我当然不会.但是求SCC还有另一个算法.复杂度和Tarjan一样,只不过常数大了点 ...
- mount状态下表空间情报试验
SQL> shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down.SQL> sta ...
- RegExp,实现匹配合法时间(24小时制)的正则表达式
合法时间格式 00:00:00 - 23:59:59 格式分析:H + ":" + M + ":" + S H-分析: 00:00:00 - 09:5 ...
- 页面添加友盟(CNZZ)统计和事件追踪
1. 在页面中引入友盟(CNZZ)统计的 JS 代码 <script type="text/javascript"> // 统计 var cnzz_protocol = ...