zoukankan      html  css  js  c++  java
  • TZOJ 2406 Power Strings(KMP找最多重复子串)

    描述

    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, exponentiation by a non-negative integer is defined in the normal way: a^0 = "" (the empty string) and a^(n+1) = a*(a^n).

    输入

    Each test case is a line of input representing s, a string of printable characters. The length of s will be at least 1 and will not exceed 1 million characters. A line containing a period follows the last test case.

    输出

    For each s you should print the largest n such that s = a^n for some string a.

    样例输入

    abcd
    aaaa
    ababab
    .

    样例输出

    1
    4
    3

    提示

    This problem has huge input, use scanf instead of cin to avoid time limit exceed.

    思路:

    就是问一个字符串写成(a)^n的形式,求最大的n.

    根据KMP的next函数的性质,已知字符串t第k个字符的next[k],那么d=k-next[k],如果k%d==0,那么t[1……k]最多可均匀的分成k/d份。也就是可以生成一个长度为d的重复度为k/d的字串。

    #include<bits/stdc++.h>
    using namespace std;
    const int M=1e6+5;
    char t[M];
    int next[M],tlen;
    void getNext()
    {
        int i=0,j=-1;
        next[0]=-1;
        while(i<tlen)
        {
            if(j==-1||t[i]==t[j])
                next[++i]=++j;
            else j=next[j];
        }
    }
    int main()
    {
        while(scanf("%s",t)!=EOF,t[0]!='.')
        {
            tlen=strlen(t);
            getNext();
            if(tlen%(tlen-next[tlen])==0)
                printf("%d
    ",tlen/(tlen-next[tlen]));
            else printf("1
    ");
        }
        return 0;
    }
  • 相关阅读:
    【测试方法】之模拟cpu/mem/io使用率
    【数据库原理】之clickhouse学习笔记
    python每日一练
    栈的压入、弹出序列
    包含min函数的栈
    顺时针打印矩阵
    二叉树的镜像
    树的子结构*
    调整数组顺序使奇数位于偶数前面
    在O(1)时间内删除链表节点
  • 原文地址:https://www.cnblogs.com/kannyi/p/8980217.html
Copyright © 2011-2022 走看看