HDU 4763 2013长春网络赛 KMP

原创 2013年12月03日 21:21:01

题意:找一个串的前缀,后缀,和中间的一部分,保证彼此不重叠且相等的最大长度

KMP的next[len]就是前缀和后缀的最大相同长度,然后只要二分找一下最优解。找中间是否存在某一个长度的前缀的时候,只要找到某个符合条件的next值大于等于前缀的长度就可以了。

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;
const int maxn=1010000;
char s[maxn];
int next[maxn];
int len;
void getnext(int len)//对s串进行预处理
{
    int i=-1,j=0;
    next[0]=-1;
    while (j<len)
    {
        if (i==-1||s[i]==s[j])
        {
            i++;j++;
            next[j]=i;
        }
        else i=next[i];
    }
}
bool ok(int p)
{
    if (p>len/3) return 0;
    bool ans =0;
    for (int i=2*p;i<=len-p;i++)
        if (next[i]>=p) return 1;
    return 0;
}
int main()
{
    int t;
    scanf("%d",&t);
    while (t--)
    {
       scanf("%s",s);
       len=strlen(s);
       getnext(len);
       int l=0,r=next[len];
       while (l<r)
       {
           int mid=(l+r)/2;
           if (ok(mid))
            {
                if (l==mid)
                {
                    if (ok(r))
                    l=r;
                    break;
                }
                l=mid;
            }
           else r=mid-1;
       }
       cout<<l<<endl;
    }
    return 0;
}

相关文章推荐

hdu 5442 Favorite Donut 最小表示法+KMP 2015长春网络赛

题意: 有一个len长度的环,问有没有 最大的 长度为 len 的 串在 这个环里。 如果有的话,且只有一个 ,输出其 开头的下标, 下标从1 开始, 再输出0 表示 顺时针 1 表示逆时针 如...

HDU 5442 Favorite Donut(最大表示法 + KMP 2015长春网络赛)

HDU 5442 Favorite Donut(最小表示法 + KMP 2015长春网络赛)

HDU 4765 Tsp 2013长春网络赛G题 DP

第一次看这个题的时候,没有完全的弄清楚给出的三个条件,导致理解出现偏差,之后又重新理了一下题意,终于搞清楚它的意思。 题意:卡车司机要送n件货物,从i+点收货,送到i-点,卡车就是一个栈,后收的货...

HDU4763 Theme Section 【KMP】

Theme Section Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

【HDU】 4763 Theme Section (KMP)

Theme Section Problem Description It's time for music! A lot of popular musicians are invite...

Hdu 4763 Theme Section (KMP+暴力 或 exKMP)

去年比赛时用后缀数组搞了半天没搞出来。。。 exKMP可以O(n)sh

HDU 4763 Theme Section(kmp)

Time Limit:1000MS Memory Limit:32768KBDescription It’s time for music! A lot of popular musicia...

HDU 4821 String (2013长春现场赛I题) 字符串Hash

题目大意: 就是现在对于给出的字符串S, 找出S中有多少个长度为M*L的子串, 满足组成M*L长度的字串是有M个不同的长度为L的串拼接起来的 大致思路: 明摆着的字符串Hash, 预处理...

HDU - 4763 Theme Section KMP

题意:给出一个字符串,找出一个尽可能长的子串,要求其在字符串的开头结尾中间都出现且不能有重叠。 KMP 先对主串跑出next数组,然后对于ptr = n,从nxt[n]开始,判断s.substr(nx...

hdu 4763 Theme Section (扩展kmp)

hdu 4763 Theme Section (扩展kmp) 题目大意:给出一个字符串,问这个字符串的最长Theme Section是多长,Theme Section要符合以下条件,必须出现在字符串的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 4763 2013长春网络赛 KMP
举报原因:
原因补充:

(最多只允许输入30个字)