博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2406 Power Strings
阅读量:6472 次
发布时间:2019-06-23

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

POJ_2406

    这个题目一开始AC的时候基本是YY出的,不过后来分析了一下这样确实可以。

    我们先对字符串和它自己做KMP,实际上也就进行普通的KMP问题的预处理阶段,然后去找P[N],P[P[N]],…中是否存在一个值为k的元素使得N%(N-k)==0,其中N为字符串长度。如果找到了k,就输出N/(N-k)即可。当然,N=1时要分开来写。

    至于为什么这样可以,还是举个例子来说明一下吧。不妨假设找到了这样的k,且N是N-k的x倍,于是我们就可以把字符串分成长度相等的x段,那么对应的匹配的情况就可以这样表示出来:

    1   2   3   …   x-1   x

        1   2   …   x-2   x-1   x

    这样,那么根据第2列就可以得到1=2,同时根据第3列就可以得到2=3,就这样一直推下去就可以得到1=2=…=x-1=x,于是我们就找了这样一个长度为N-k的循环节。同时,由于在寻找k的过程中k是单调递减的,那么N-k便是单调递增的,于是我们一定会最先找到长度最小的循环节。

#include
#include
#define MAXD 1000010 char b[MAXD]; int S[MAXD], P[MAXD], N; void solve() {
int i, j, k; for(i = 1; b[i]; i ++) S[i] = 0; N = i - 1; j = 0; P[1] = P[0] = 0; for(i = 2; b[i]; i ++) {
while(j > 0 && b[j + 1] != b[i]) j = P[j]; if(b[j + 1] == b[i]) ++ j; P[i] = j; } if(N == 1) printf("1\n"); else {
for(k = P[N];; k = P[k]) if(N % (N - k) == 0) {
printf("%d\n", N / (N - k)); break; } } } int main() {
for(;;) {
scanf("%s", b + 1); if(b[1] == '.') break; solve(); } return 0; }

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

你可能感兴趣的文章
虚拟化--003 vcac licence -成功案例
查看>>
windows server 2003各版本及2008各版本的最大识别内存大小
查看>>
OSChina 周六乱弹 ——揭秘后羿怎么死的
查看>>
centos查找未挂载磁盘格式化并挂载
查看>>
IT人员的职业生涯规划
查看>>
sorry,you must have a tty to run sudo
查看>>
ios开发中使用正则表达式识别处理字符串中的URL
查看>>
项目中的积累,及常见小问题
查看>>
Python类型转换、数值操作(收藏)
查看>>
注释书写格式
查看>>
SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别
查看>>
2013=7=30 自增量的浅谈
查看>>
oracle11g dataguard 安装手册(转)
查看>>
java并发包分析之———Deque和LinkedBlockingDeque
查看>>
1. Two Sum - Easy - Leetcode解题报告
查看>>
SQLiteHelper
查看>>
多线程---同步函数的锁是this(转载)
查看>>
鱼C记事本V1.0(下)- 零基础入门学习Delphi28
查看>>
百练 2742 统计字符数 解题报告
查看>>
Ubuntu搜狗输入法候选词乱码
查看>>