Theme Section HDU - 4763 (经典next数组应用)

题目链接

题意:输出最长的前缀, 前缀要满足在原串中至少匹配3次。

思路:很容易想到前缀E和后缀E可以用next数组求出,然后在判断中间的E是否存在,具体做法是:next[len]=i,在[2 * i ,len - i](因为不能重合)内找是否有next[j]=i,存在则i就为答案,但是不存在的话不能继续i--找应该令i=next[i],用到了next数组border的性质。很容易想到失配时的跳转,因为中间那段肯定也不满足寻找得到三个。

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<map>
#include<algorithm>
#define N 200060
#define ll long long
using namespace std;
const int maxn=2000110;
char str[maxn];
int nextt[maxn];
void getnext(int len)
{                        
    int i=0,j=-1;
    nextt[i]=j;
    while(i<len)
    {
        if(j==-1||str[i]==str[j])
        {
            i++;j++;nextt[i]=j;
        }
        else
        j=nextt[j];
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",str);
        int n=strlen(str);
        getnext(n);
        int ans=0;
        for(int i=nextt[n];i;i=nextt[i])
        {
            for(int j=i*2;j<=n-i;j++)
            {
                if(nextt[j]==i)
                {
                    ans=i;
                    break;
                }
            }
            if(ans)
            {
                break;
            }
        }
        printf("%d\n",ans);
    }
}

 

posted @ 2020-09-16 12:48  Ldler  Views(113)  Comments(0Edit  收藏  举报