zoukankan      html  css  js  c++  java
  • HDU

    给定一个字符串,求出一个前缀A,使得字符串的构成可以表示成ABABA的形式(B可以为空串)。

    输出这个前缀的最大长度。

    KMP算法Next数组的使用。

    枚举中间的每个位置,可以根据Next数组求出这个位置对应的前缀。然后暴力判断前缀与后缀是否相等即可。

    如图,枚举的位置为 i,则Next[i] = j,。然后判断0~j 是否和 k~len是否是相同的。

    注意要判断合法性,即前缀 + 中缀的长度不能比当前枚举的位置大,且后缀开始的位置一定要比当前枚举的位置大。

    判定完Next[i]后,一定要判定Next[ Next[i] ],这样递归下去,看看大的如果不符合,小的是否符合。

    然而复杂度,我不会证明。

    #include <bits/stdc++.h>
    using namespace std;
    #define maxn 1000010
    
    int Next[maxn];
    
    
    void GetNext(char s[], int len)
    {
            Next[0] = -1;
            int j = -1;
            for (int i = 1; i < len; i++)
            {
                    while(j > -1 && s[j+1] != s[i])
                            j = Next[j];
                    if (s[j+1] == s[i]) j++;
                    Next[i] = j;
            }
    }
    
    int main()
    {
            int n;
            scanf("%d", &n);
            for (int ca = 1; ca <= n; ca++)
            {
                    char s[maxn];
                    scanf("%s", s);
                    int len = strlen(s), ans = 0;
                    GetNext(s, len);//求出Next数组
    
                    for (int i = len-1; i >= 0; i--)
                    {
                            int j = i;
                            while(j > -1)
                            {
                                    if ((j+1)*2 <= i+1 && len - (j+1) > i)//判断相互的位置的合法性
                                    {
                                            int flag = 1;
                                            for (int k = 0; k < j+1; k++)
                                                    if (s[len - (j+1) + k] != s[k])
                                                    {
                                                            flag = 0;
                                                            break;
                                                    }
                                            if (flag) //前缀和后缀匹配
                                                    ans = max(ans, j+1);
                                    }
                                    j = Next[j]; //判断比它小的是否符合
                            }
                    }
                    printf("%d
    ", ans);
            }
    
    }
  • 相关阅读:
    Datatable导出到Excel
    C# 连接EXCEL和ACCESS字符串2003及2007版字符串说明
    C#-读取写入Excel
    简易的命令行入门教程:
    日志记录
    python环境管理器的选择
    go语言的模块处理
    pip 使用国内源 安装类库
    go 实现单链表并使用一种常规实现翻转,一种使用递归实现翻转
    数据库产品选型
  • 原文地址:https://www.cnblogs.com/ruthank/p/9490900.html
Copyright © 2011-2022 走看看