Period

题意:一个长为N (2 <= N <= 1 000 000) 的字符串,问前缀串长度为k(k > 1)是否是一个周期串,即k = A...A;若是则按k从小到大的顺序输出k即周期数;

Sample Input
3 aaa
12 aabaabaabaab
0
 
Sample Output
Test case #1
2 2
3 3
 
Test case #2
2   2
6   2
9   3
12  4
 题目其实是来自于LA的..挺好的一道题,用的是原版的kmp..
写写对KMP的理解:
这里写的kmp直接是从0开始的,并且0,1失配都指向0;kmp的getfail()其实就是用当前确定的p[i] = p[[f[i]]来给i+1一个匹配的机会,(特别注意不是相等)即f[i+1] = j+1;这就是失配边的下标转移;在i+1时,只是找了和p[i]相等的d[f[j]],但是并没有去改变原来的匹配关系,这只是为了递推下去;
还有需要注意的就是kmp其实匹配到了第len位,这一位原本是'\0'的,但是由于里面的递推下一位的关系,这一位其实也是匹配了的;这道题就能用到第len的匹配关系~~很妙
 
思路:怎么知道前缀长度为2的串是是周期串?如aa?这时我们需要往后移到1位,我们怎么知道要往后一道以为呢?这正是f[i]的失配边的含义了~~由于若p[0] = p[1] = 'a';那么在p[2]失配时,显然朴素的KMP的f[2] = 1;这就弄成了周期;这也是为什么下面是从2开始到n的;
还有i代表的就是前缀的长度;即k(i - f[i]) = i,(k > 1)所以f[i] > 0并且(i-f[i])|i;
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 1e6 + ;
char p[N];
int f[N];
void getfail(char *p,int *f)
{
f[] = f[] = ;
int n = strlen(p);
for(int i = ;i < n;i++){
int j = f[i];
if(j && p[i] != p[j]) j = f[j];
f[i+] = (p[i] == p[j] ?j+:);// i+1会递推到第n位
}
}
int main()
{
int n,kase = ;
while(scanf("%d",&n) == && n){
scanf("%s", p);
getfail(p,f);
printf("Test case #%d\n",kase++);
for(int i = ;i <= n;i++){// i = n **
if(f[i] > && i%(i-f[i])==)
printf("%d %d\n",i,i/(i-f[i]));
}
puts("");
}
}
 

hdu 1358 period KMP入门的更多相关文章

  1. hdu 1358 Period(KMP入门题)

    Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  2. HDU 1358 Period KMP

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1358 求周期问题,简单KMP—— AC代码: #include <iostream> # ...

  3. HDU 1358 Period(KMP计算周期)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358 题目大意:给你一串字符串,判断字符串的前缀是否由某些字符串多次重复而构成. 也就是,从第1个字母 ...

  4. Hdu 1358 Period (KMP 求最小循环节)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1358 题目描述: 给出一个字符串S,输出S的前缀能表达成Ak的所有情况,每种情况输出前缀的结束位置和 ...

  5. HDU 1358 Period(KMP next数组运用)

    Period Problem Description For each prefix of a given string S with N characters (each character has ...

  6. [HDU 1358]Period[kmp求周期]

    题意: 每一个power前缀的周期数(>1). 思路: kmp的next. 每一个前缀都询问一遍. #include <cstring> #include <cstdio> ...

  7. HDU 1358 Period (kmp求循环节)(经典)

    <题目链接> 题目大意: 意思是,从第1个字母到第2字母组成的字符串可由某一周期性的字串(“a”) 的两次组成,也就是aa有两个a组成: 第三行自然就是aabaab可有两个aab组成: 第 ...

  8. HDU 3746 - Cyclic Nacklace & HDU 1358 - Period - [KMP求最小循环节]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3746 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

  9. KMP + 求最小循环节 --- HDU 1358 Period

    Period Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=1358 Mean: 给你一个字符串,让你从第二个字符开始判断当前长度 ...

随机推荐

  1. 用C# sqlserver实现增删改查

    using System.Data;using System.Data.SqlClient;//先打开两个类库文件SqlConnection con = new SqlConnection(); // ...

  2. 在android的spinner中,实现取VALUE值和TEXT值

    为了实现在android的spinner实现取VALUE值和TEXT值,我尝试过好些办法,在网上查的资料,都是说修改适配器,刚开始我也是通过修改适配器的方法来做的,但是如果一个activity有多个s ...

  3. Swift基础语法-内存管理, 自动引用计数

    1. 工作机制 Swift和OC一样,采用自动引用计数来管理内存 当有一个强引用指向某一个对象时,该对象的引用计数会自动+1 当该强引用消失时,引用计数会自动-1 当引用计数为0时,该对象会被销毁 2 ...

  4. 各I/O模型 对应Web服务应用模型(select,poll,epoll,kevent,"/dev/poll")

    一.利用select多路复用I/O的Web服务应用模型  /* 可读.可写.异常三种文件描述符集的申明和初始化.*/ fd_set readfds, writefds, exceptionfds; F ...

  5. java面板

    import java.awt.Color; import java.awt.Container; import javax.swing.JFrame; import javax.swing.JLab ...

  6. Java - 使用 XSD 校验 XML

    package com.huey.dream.utils; import java.io.IOException; import java.io.InputStream; import javax.x ...

  7. Android带头像的用户注册页面

    详细的图文可以到我的百度经验去查看:http://jingyan.baidu.com/article/cd4c2979eda109756e6e60de.html 首先是注册页面的布局: <?xm ...

  8. 【重叠I/O之系列三】I/O完成端口

    一   串行模式和并行模式 一般一个服务应用程序采用以下两个架构模型之一: 串行模式  一个线程等待一个客户发出的请求,当请求到达的时候,线程会被换醒来处理客户的请求. 并发模式.一个线程等待一个客户 ...

  9. C#集合之ArrayList

    C#中之所以有集合这个东东,是因为数组的长度是固定的,而实际需求是,不确定未来这个“数组”的个数,故出现集合这个概念,因为集合的容量会随元素的增加曾倍数增长.C#中有2类常用集合:ArrayList, ...

  10. ubuntu恢复rm -rf误删文件

    使用extundelete工具 sudo apt-get install extundelete 恢复操作命令 首先需要umount或者read only 分区  umount /dev/partit ...