博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 2406 Power Strings(KMP)
阅读量:4205 次
发布时间:2019-05-26

本文共 1163 字,大约阅读时间需要 3 分钟。

Power Stringspku 2406

给定两个字符串 a b,我们定义 a*b 为两个字符串的联接。例如,a = "abc" b = "def",则a*b = "abcdef"。把这个定义的运算看做多项式,则一个字符串的非负整数次幂定义如下: a^0 = "" (一个空字符串) a^(n+1) = a*(a^n)

输入:

每个测试样例为一行,即一个字符串s,其长度至少为1且不超过1000000。以句号“.”为最后一组测试样例。

输出:

对于每个给出的字符串s,你应该输出最大的n使得 s = a^n 等于某个字符串 a

输入样例:

abcd

aaaa

ababab

.

    输出样例:

1

4

    3

分析

题目意思是对于给定的字符串s,找到其最短子串a,满足重复子串a可以得到字符串s。那么这个最短子串是s[next[len]]s[next[len]+1]...s[len-1]。当len%(len-next[len])==0时,说明字符串s有满足条件的不是它本身的子串,len/(len-next[len])即为所求最大的n。当len%(len-next[len])!=0时,字符串s除了它本身没有满足条件的子串,故n=1

代码:

#include
#include
#include
using namespace std;int next[1000005];int len;int get_next(char *p){ next[0] = -1; int i = 0, j = -1; while(i <= len) { while(j == -1 || (i < len && p[i] == p[j]) ) { i++; j++; next[i] = j; } j = next[j]; } return 0;}int main(){ char a[1000005]; while(scanf("%s", a) != EOF && strcmp(a,".") != 0) { len = strlen(a); get_next(a); if(len % (len - next[len]) == 0) printf("%d\n", len / (len - next[len])); else printf("1\n"); } return 0;}

转载地址:http://lsali.baihongyu.com/

你可能感兴趣的文章
SQL注入漏洞全接触--进阶篇
查看>>
SQL注入漏洞全接触--高级篇
查看>>
SQL注入法攻击一日通
查看>>
菜鸟入门级:SQL注入攻击
查看>>
用vbs来写sql注入等80端口的攻击脚本
查看>>
C# 检查字符串,防SQL注入攻击
查看>>
关于对SQL注入80004005 及其它错误消息分析
查看>>
即时通软件性能测试(与宴宾的对话)
查看>>
应用软件性能测试的艺术(翻译)——序
查看>>
高级性能测试(翻译)
查看>>
Web安全测试解决方案
查看>>
今天开始上班
查看>>
开源测试研究方案泡汤了
查看>>
晒一下我培训的课程——应用系统性能测试规划、实施与分析
查看>>
利用 STAF 实现程序更新包的自动部署测试
查看>>
周末参加“北京干部管理职业技术学院”关于高职课程改革的专家讨论会
查看>>
软件自动化测试框架的发展
查看>>
实现haproxy+LNMT负载均衡架构
查看>>
论文浅尝 | 通过共享表示和结构化预测进行事件和事件时序关系的联合抽取
查看>>
论文浅尝 | 融合多粒度信息和外部语言知识的中文关系抽取
查看>>