Power Strings(poj 2406)

题意:求字符串中循环节出现的次数

KMP!!!

#include<cstdio>
#include<iostream>
#include<cstring>
#define M 1000010
using namespace std;
int fail[M],a[M],m;
char ch[M];
void kmp_init()
{
    fail[1]=0;
    for(int i=2;i<=m;i++)
    {
        int p=fail[i-1];
        while(p&&a[p+1]!=a[i])p=fail[p];
        if(a[p+1]==a[i])
          fail[i]=p+1;
        else fail[i]=0;
    }
}
int main()
{
    while(scanf("%s",ch))
    {
        if(ch[0]==‘.‘)break;
        memset(fail,0,sizeof(fail));
        m=strlen(ch);
        for(int i=1;i<=m;i++)
          a[i]=ch[i-1];
        kmp_init();
        int ans=m-fail[m];
        if(m%ans==0)printf("%d\n",m/ans);
        else printf("1\n");
    }
    return 0;
}

时间: 2024-10-12 15:20:45

Power Strings(poj 2406)的相关文章

Power string(poj 2406)

题目大意,给出一个字符串s,求最大的k,使得s能表示成a^k的形式,如 abab 可以表示成(ab)^2: 方法:首先 先求kmp算法求出next数组:如果 len mod (len-next[len])==0 ,答案就是 len /(len-next[len]),否则答案是1:证明如下: 如果s能表示成 a^k的形式且k>1,k尽可能大,即s可以表示成aaaaaa(k个a):那么next[len]就等于k-1个a的长度:aaaaaaa  aaaaaaa那么 (len-next[len])a的长

poj 2406 Power Strings(KMP求循环次数)

题目链接:http://poj.org/problem?id=2406 Description Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, e

poj 2406 Power Strings(kmp循环节)

题目链接:http://poj.org/problem?id=2406 题目大意:如果n%(n-next[n])==0,则存在重复连续子串,长度为n-next[n]. 例如:      a    b    a    b    a    b next:-1   0    0    1    2    3    4 next[n]==4,代表着,前缀abab与后缀abab相等的最长长度,这说明,ab这两个字母为一个循环节,长度=n-next[n]; 1 #include <iostream> 2

HDU 1325 Is It A Tree? (POJ 1308)

并查集问题... 这题以前做过-- 以前做过-- 做过-- 过-- 不过重做时候被吭得异常之爽-- 在判断 vis[i]的时候.我记得标准C++是非0 即为真. 而我用C++ 提交的时候 if(vis[i]) 去直接给我WA了. 用G++ 就AC了...然后改成if(vis[i]==1) 交C++ 就AC了. 特瞄的我每次初始化都把 vis[i] 都赋值为 0 了..都能出这种错? 求路过大神明示我的错误. 题意是判断是否是一棵树. 不能存在森林,用并查集合并,每个点的入度不能超过1. 比如 1

HDU 1535 Invitation Cards (POJ 1511)

两次SPFA.求 来 和 回 的最短路之和. 用Dijkstra+邻接矩阵确实好写+方便交换,但是这个有1000000个点,矩阵开不了. d1[]为 1~N 的最短路. 将所有边的 邻点 交换. d2[] 为 1~N 的最短路. 所有相加为 所要答案. 忧伤的是用SPFA  "HDU 1535"  AC了,但是POJ 一样的题 "POJ 1511" 就WA了. 然后强迫症犯了,不停的去测试. 题意中找到一句关键话 :Prices are positive integ

Javascript中,数学方法可以分成以下几类: constans(常数)、power functions(乘方函数)、trigonometic functions(三角函数)、rounding functions(舍入函数)、random numbers(随机数字)

在Javascript中,数学方法可以分成以下几类: constans(常数).power functions(乘方函数).trigonometic functions(三角函数).rounding functions(舍入函数).random numbers(随机数字) 常数和乘方函数 Math.E 自然对数的底(为常数) 2.718 Math.LN10 10的自然对数 2.302 Math.LN2 2的自然对数 0.693 Math.PI 圆周率 3.1415 Math.SQRT1_2 1/

uva11081 - Strings(递推)

题目:uva11081 - Strings(递推) 题目大意:给你三个字符串A,B,C.然后问你用A和B的中一些子串(可以有空串)拼出C的方法数.这里的子串指的是将A,B中去掉一些字符得到新的子串. 题目大意:这题应该和之前有一题,给出A和C,问C可以由多少的A的子串表示差不多,不一样的是这里是可以由两个串来表示了.一开始只开一个三维数组,结果发现怎么算,结果都太大了.觉得肯定是有重复计算了.后面看了题接才发现原来应该开三个三维数组.f1[i][j][k]代表:拼出第三个串的第K个字符时,用到了

【LeetCode-面试算法经典-Java实现】【205-Isomorphic Strings(同构字符串)】

[205-Isomorphic Strings(同构字符串)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 代码下载[https://github.com/Wang-Jun-Chao] 原题 Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the characters in s can be replaced to get t. All

每日一dp(1)——Largest Rectangle in a Histogram(poj 2559)使用单调队列优化

Largest Rectangle in a Histogram 题目大意: 有数个宽为1,长不定的连续方格,求构成的矩形中最大面积 /************************************************************************/ /* 思路1. 当前为n的面积如何与n-1相联系,dp[i][j]=max(dp[i-1][k]) , 0<k<=j 描述:i为方块个数,j为高度 但是此题目的数据对于高度太变态,h,1000000000 ,n,1