hdu1358 Period
首先给个博客:http://blog.csdn.net/lttree/article/details/20732385
感觉他说的很好,尤其是引用的那个博客,清晰的说明了循环节的两个公式。
http://www.cnblogs.com/jackge/archive/2013/01/05/2846006.html
那我就在重复一遍,这两个公式这的很重要。
对于这个循环节就是两个公式,
在i位置可以判断0~i-1的循环:
如果i%(i-next[i])==0 那么就有循环,并且next[i]!=0,
循环次数为 i/(i-next[i])
循环长度为 i-next[i]
这题还有一个坑的地方,我在代码里注释了,就是先要赋值dd,在循环,否则真的会超时,,,,坑死我了 = =
for (int i=2;i<=strlen(str);i++) 就是说这样是错的
#include <bits/stdc++.h>
using namespace std; const int INF=0x3f3f3f3f;
typedef long long LL;
#define PI(A) printf("%d\n",A)
#define SI(N) scanf("%d",&(N))
#define SII(N,M) scanf("%d%d",&(N),&(M))
#define cle(a,val) memset(a,(val),sizeof(a))
#define rep(i,b) for(int i=0;i<(b);i++)
#define Rep(i,a,b) for(int i=(a);i<=(b);i++)
#define reRep(i,a,b) for(int i=(a);i>=(b);i--)
//#define next Next
const double EPS= 1e- ; /* ///////////////////////// C o d i n g S p a c e ///////////////////////// */ const int MAXN= + ; //kuangbin 模板
//Next[]调用的时候不需要初始化
int Next[MAXN];
void kmp_pre(char x[])
{
int m=strlen(x);
int i,j;
j=Next[]=-;
i=;
while(i<m)
{
while(-!=j&&x[i]!=x[j]) j=Next[j];
Next[++i]=++j;
}
} char str[MAXN];
int N,k; int main()
{
while(~SI(N),N)
{
scanf("%s",str);
kmp_pre(str); //特别注意这里,一定要先把strlen(str)的值赋给dd 不能直接for (int i=2; i<=strlen(str); i++) 这样会TLE
int dd=strlen(str); printf("Test case #%d\n",++k);
//注意注意
for (int i=; i<=dd; i++)
{
int d=i-Next[i];
if (i%d==&&i>d)
{
printf("%d %d\n",i,i/d);
}
}
puts("");
}
return ;
}
第二遍,自己写的AC代码
#include <bits/stdc++.h>
using namespace std; const int INF=0x3f3f3f3f;
typedef long long ll;
#define PU puts("");
#define PI(A) printf("%d\n",A)
#define SI(N) scanf("%d",&(N))
#define SII(N,M) scanf("%d%d",&(N),&(M))
#define cle(a,val) memset(a,(val),sizeof(a))
#define rep(i,b) for(int i=0;i<(b);i++)
#define Rep(i,a,b) for(int i=(a);i<=(b);i++)
#define reRep(i,a,b) for(int i=(a);i>=(b);i--)
const double EPS= 1e- ; /* ///////////////////////// C o d i n g S p a c e ///////////////////////// */ const int MAXN= + ;
int Next[MAXN];
int len;
char x[MAXN]; void kmp_pre()
{
int i,j;
j=Next[]=-;
i=;
while(i<len)
{
while(-!=j&&x[i]!=x[j])j=Next[j];
Next[++i]=++j;
}
}
int T;
int main()
{
#ifndef ONLINE_JUDGE
freopen("C:\\Users\\Zmy\\Desktop\\in.txt","r",stdin);
// freopen("C:\\Users\\Zmy\\Desktop\\out.txt","w",stdout);
#endif
while(~SI(len),len)
{
scanf("%s",x);
kmp_pre();
printf("Test case #%d\n",++T);
for (int i=; i<=len; i++)
{
if (i%(i-Next[i])==&&Next[i]!=)
{
//i-Next[i]是循环串的长度,总长 除 循环串的长度就是 次数
// i / (i-Next[i])
printf("%d %d\n",i,i/(i-Next[i]));
}
}
PU;
}
return ;
}
hdu1358 Period的更多相关文章
- HDU1358 Period —— KMP 最小循环节
题目链接:https://vjudge.net/problem/HDU-1358 Period Time Limit: 2000/1000 MS (Java/Others) Memory Lim ...
- poj1961 & hdu1358 Period【KMP】
Period Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 20436 Accepted: 9961 Descripti ...
- kuangbin专题十六 KMP&&扩展KMP HDU1358 Period
For each prefix of a given string S with N characters (each character has an ASCII code between 97 a ...
- HDU-1358 Period 字符串问题 KMP算法 求最小循环节
题目链接:https://cn.vjudge.net/problem/HDU-1358 题意 给一个字符串,对下标大于2的元素,问有几个最小循环节 思路 对每个元素求一下minloop,模一下就好 提 ...
- [KMP求最小循环节][HDU1358][Period]
题意 求所有循环次数大于1的前缀 的最大循环次数和前缀位置 解法 直接用KMP求最小循环节 当满足i%(i-next[i])&&next[i]!=0 前缀循环次数大于1 最小循环节是i ...
- hdu1358 Period kmp求循环节
链接 http://acm.hdu.edu.cn/showproblem.php?pid=1358 思路 当初shenben学长暑假讲过,当初太笨了,noip前几天才理解过来.. 我也没啥好说的 代码 ...
- hdu1358 Period KMP
给出一个字符串,找出所有可以作为它循环节的子串长度 利用kmp的失配数组的性质,可以直接做 #include<stdio.h> #include<string.h> ; cha ...
- HDU1358 Period 题解 KMP算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358 题目大意:给你一个长度为 \(n\) 的字符串 \(s\) ,那么它有 \(n\) 个前缀. 对 ...
- KMP 、扩展KMP、Manacher算法 总结
一. KMP 1 找字符串x是否存在于y串中,或者存在了几次 HDU1711 Number Sequence HDU1686 Oulipo HDU2087 剪花布条 2.求多个字符串的最长公共子串 P ...
随机推荐
- P168 实战练习(权限修饰符)
创建Game类,运行代码如下: package org.hanqi.pn0120; public class Game { private String name; private String ca ...
- layer 一款口碑极佳的web弹层组件,弹框专用
研究学习网址: http://layer.layui.com/
- POJ-3107 Godfather
题目大意:给一棵无根树,找出所有满足下面的条件的点:删除它后,最大子树中的个数最少. 题目分析:两次深搜,第一次找出子树中节点的个数,第二次维护最大子树. ps:边用vector保存时会超时... 代 ...
- Android开源框架ImageLoader的完美例子
本文转载于:http://blog.csdn.net/wwj_748/article/details/10079311 2013年8月19日开源框架之Universal_Image_Loader学习 ...
- tar学习使用心得
tar如何解压文件到指定的目录?#tar zxvf mysql.tar.gz -C /home/aaa 暂时用到这,所以学到这,日后再更新 近日用tar解压一个文件时发现这样的错误: # tar -z ...
- feature visualization from ipython notebook
Feature visualization from ipython notebook Wang Xiao 1. install anaconda2 from: https://www.continu ...
- mysql学习之-逻辑架构
mysql逻辑架构图: 第一层,服务层(为客户端服务):为请求做连接处理,授权认证,安全等. 1. 每个连接的查询都在一个进程中的线程完成. 2. 服务器负责缓存线程,所以服务层不需要为每个连接新 ...
- 进程kswapd0与events/0消耗大量CPU的问题
http://www.nowamagic.net/librarys/veda/detail/2539 今天下午网站宕了两次机,发工单给阿里云,发现原因是服务器的CPU 100%了. 重启服务器后,使用 ...
- ruby-gem
gem包管理 ruby的第三方插件是用gem方式来管理,这是一个非常容易发布和共享,一个简单的命令就可以安装上第三方的扩展库 gem install rails 安装ruby on rails gem ...
- asp.net系统过滤器、自定义过滤器
原文地址:http://www.cnblogs.com/kissdodog/archive/2013/05/21/3090513.html 一.系统过滤器使用说明 1.OutputCache过滤器 O ...