zoukankan      html  css  js  c++  java
  • 求一个字符串中子串连续出现的最大次数

         D: 字符串最大表示

    Time Limit: 1 s      Memory Limit: 128 MB     
     

    Problem Description

    有如下定义,abcn

    表示字符串abc重复n次,例如abc2

    表示abcabc。

    给定一个字符串,求可以被表示的最大n,例如:aaaa最大个数是4,重复子串为a;abababab最大个数是4,重复子串是ab;ababababc最大个数是1, 重复子串是ababababc。

    Input

    第一行输入n,表示字符串的个数。(n <= 100)

    接下来n行,每行一个字符串。(字符串长度<=100000)

    Output

    输出可以表示给定字符串的最大子串个数

    Sample Input

    3
    aaaa
    abababab
    abc
    

    Sample Output

    4
    4
    1
    

    Hint

    输入数据量大,推荐使用scanf

    题意: 给出一个字符串s,求重复子串出现的最大次数
    分析:kmp的next[]数组的应用
    要求重复子串出现的最大次数,其实就是要求字符串的最小循环节
    这里我们假设这个字符串的长度是len,那么如果len可以被len-next[len]整除的话,我们就可以说
    len-next[len]就是那个最短子串的长度
    为什么呢? 假设我们有一个字符串 ababab 那么next[6]=4, 由于next的性质,匹配失配后,下一个能继续进行匹配的位置,
    也就是说,把字符串的前四个字母,abab,平移2个单位,这个abab一定与原串的abab重合(否则就不满足失败函数的性质)

    #include<iostream>
    #include<algorithm>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    const int N = 1000005;
    int i, n, m, t, sum;
    char T[N], P[N];//P[]是需要比较的字符串,T[]是被比较的字符串
    int next1[N];
    void getnext(char  *P, int *next1)
    {
        int j = 0;
        int k = -1;
        next1[0] = -1;
        while (j <= m)
        {
            if (k == -1 || P[j] == P[k])
            {
                next1[++j] = ++k;
            }
            else
            {
                k = next1[k];
            }
        }
    }
    int main()
    {
        cin >> t;
        while (t--)
        {
            scanf("%s", P);
            m = strlen(P);
            getnext(P, next1);
            n = m - next1[m];
            if (m%n==0)
                cout <<m/n<< endl;
            else 
                cout<<1<<endl;
        }
        return 0;
    }
  • 相关阅读:
    while循环学习之统计流量
    MySQL的启动脚本
    UVA 725 Division
    UVA 712 S-tree
    UVA 514
    字典树
    UVA 1595 multimap 的应用
    C++ map 和 multimap
    浮点数
    UVA 227
  • 原文地址:https://www.cnblogs.com/-citywall123/p/10034261.html
Copyright © 2011-2022 走看看