codeforces 126B password[kmp]

题目大意:给定一个字符串,找出其中一个最长的子串,使得这个子串既是前缀又是后缀又在中间出现

题目分析:我们看到前后缀很自然的可以想到Kmp中的next数组,那么如何处理是否在中间呢?我一开始构建了一个s除去头尾的子串,试图在其中用find函数去查找是否存在这样的串,很显然这样的复杂度是很高的,会T,我们可以发现,我们在求next的数组的时候,就是求最长前缀后多少个,因此,我们只要记录除了最后一个字符意外的前面的最长前缀的情况,也就是除去后缀之后,前缀和中间出现的又构成的一个前后缀,我们只要找到满足这样条件的子串即可。

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+50;
const int inf=0x3f3f3f3f;
const int mod =1e9+7;
int next[maxn];
int _hash[maxn];
void getnext(string s)
{
    int len=s.size();
    int i=0,j=-1;
    next[0]=-1;
    while(i<len)
    {
        if(j==-1||s[i]==s[j])
        {
            next[++i]=++j;
        }
        else j=next[j];
    }
    for(int i=1;i<len;i++)
    {
        _hash[next[i]]++;
    }
}
int main()
{
    string a;
    cin>>a;
    getnext(a);
    int len = a.size();
    int k=next[len];

    while(k)
    {
        if(_hash[k])
        {
            for(int i=0;i<k;i++)
            {
                cout<<a[i];
            }
            return 0;
        }
        k=next[k];
    }
    printf("Just a legend\n");
    return 0;
}
全部评论

相关推荐

Tom哥981:这份简历是“大一新生硬凹资深后端”的典型反面教材,槽点离谱到能让面试官直接笑出声: ### 1. 「年龄+入学时间」和项目复杂度完全脱节,可信度直接归0 你2024年7月才入学(现在刚读了1年多),19岁的大一新生,能把Vue3+Spring Boot+ShardingSphere+K8s+AI这些技术全塞进两个项目里?别说实际开发,光把这些技术的文档看完都得半年——这不是“能力强”,是“把招聘JD里的技术词全抄过来造假”,明摆着没碰过实际代码
点赞 评论 收藏
分享
2025-12-16 22:45
已编辑
电子科技大学 活动运营
Rain_Codin...:简历感觉有点乱了而且一股AI味,AI简历的一个特点就是废话很多,一个点能分成四个点来讲,可以仔细优化一下。 btw,手机看简历不好看出来,可以把电脑上的简历截图放出来。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务