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-9 ;

/*  /////////////////////////     C o d i n g  S p a c e     /////////////////////////  */

const int MAXN= 1000000 + 5 ;

//kuangbin 模板
//Next[]调用的时候不需要初始化
int Next[MAXN];
void kmp_pre(char x[])
{
    int m=strlen(x);
    int i,j;
    j=Next[0]=-1;
    i=0;
    while(i<m)
    {
        while(-1!=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=2; i<=dd; i++)
        {
            int d=i-Next[i];
            if (i%d==0&&i>d)
            {
                printf("%d %d\n",i,i/d);
            }
        }
        puts("");
    }
    return 0;
}
时间: 2024-11-07 10:14:46

hdu1358 Period的相关文章

hdu-1358 Period 【kmp】

Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3443    Accepted Submission(s): 1727 Problem Description For each prefix of a given string S with N characters (each character has an ASCI

HDU-1358 Period 字符串问题 KMP算法 求最小循环节

题目链接:https://cn.vjudge.net/problem/HDU-1358 题意 给一个字符串,对下标大于2的元素,问有几个最小循环节 思路 对每个元素求一下minloop,模一下就好 提交过程 TLE maxn没给够 AC 代码 #include <cstring> #include <cstdio> const int maxm=1e6+20; char P[maxm]; int fail[maxm]; void getFail(int m){ fail[0]=fa

[KMP]HDU1358 Period

题目链接 思考 题目就是利用KMP的失配数组来找循环串.具体看代码注释 #include <iostream> #include <cstdio> #include <cstring> using namespace std; int nexta[1000002]; char s[1000002]; int n; //失配数组 void getnexta() { memset(nexta,0,sizeof(nexta)); int k = -1,j = 0; nexta

HDU1358 Period【KMP】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1358 题目大意: 给你长度为N的字符串s,求字符串s的循环前缀的长度和循环的次数. 例如:长度为8的字符串:"abababab" 长度为4的前缀"abab",循环前缀为"ab",循环2次 长度为6的前缀"ababab",循环前缀为"ab",循环3次 长度为8的前缀"abababab",循环

hdu1358 Period(kmp周期)

题目链接:点击打开链接 题意描述:给一个字符串,求这个字符串中每个前缀自身是否有周期性? 解题思路:kmp即可 代码: #include <cstdio> #include <cstring> #define MAXN 1000010 using namespace std; void getNext(char* str,int len,int* next){ int i,j; j=next[0]=-1; i=0; while(i<len){ while(j!=-1&

E - Period HDU-1358

题目大意: 多组.给一个n,输入长度为n 的串,求:这个串所有存在循环节的前缀,输出前缀长度和循环次数(不重叠). 解题思路: 从i=0开始,判断前缀是不是存在循环节,即(i+1)%(i-next[i]) 是否==0 .注:next[i]值是0或-1的忽略,说明前面不存在任何循环节.(关于循环节解释的见<KMP 专题知识>). 参考代码: 1 #include <iostream> 2 #include <stdio.h> 3 using namespace std;

(KMP 1.5)hdu 1358 Period(使用next数组来求最小循环节——求到第i个字符的循环节数)

题目: Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3813    Accepted Submission(s): 1862 Problem Description For each prefix of a given string S with N characters (each character has an A

今天的工作状态,规划未来一段时间内必须完成的事情(Record the working status of today,planning for the next period of time must be completed)

中文: 今天的工作状态,规划未来一段时间内必须完成的事情 待完成功能:(本周完成,不包括modbus传感器,完成之后就不管了) 1.传感器识别功能框架: 根据四个上拉电阻自动识别工作模式:数字型传感器.模拟形传感器.modebus式传感器 2.类似于红外的FD把STM32远程升级功能实现(思考实现方法,如此大的程序,分段存储吗?待处理)3.基于Zigbee的485的透传实现 业余生活: 1.把以上功能实现,ESP8266的AT指令掌握使用,然后基于Linux开发简单的功能(基础) 2.把TI的C

POJ1961 Period

Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 18405   Accepted: 8920 Description For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether the