Codeforces 126B. Password (KMP)

<题目链接>

题目大意:
给定一个字符串,从中找出一个前、中、后缀最长公共子串("中"代表着既不是前缀,也不是后缀的部分)。

解题分析:
本题依然是利用了KMP中next数组的性质。具体做法见代码。

#include <bits/stdc++.h>
using namespace std;

const int N = 1e6+5;

char str[N];
int vis[N],nxt[N];

void getNext(int len){
    int j=0,k=-1;
    nxt[0]=-1;
    while(j<len){
        if(k==-1||str[j]==str[k]){
            nxt[++j]=++k;
            if(j>=2 && j<len)vis[k]=1; //表示中部的字符串也存在这样一个最长公共的前缀后缀(因为这里控制了j>=2 && j < m)
        }else k=nxt[k];
    }
}
int main(){
    scanf("%s",str);int len=strlen(str);
    getNext(len);
    int sz=nxt[len];
    bool fp=false;
    if(sz){
        if(vis[sz])fp=true;
        else if(nxt[sz])sz=nxt[sz],fp=true;  //在原串的最长公共前、后缀子串中的前缀子串部分中再求一次最长公共前后缀子串,此时符合的情况也可作为答案
        str[sz]=‘\0‘;    //直接将这个符合条件的前缀输出即可
    }
    if(fp)puts(str);
    else puts("Just a legend");
}

原文地址:https://www.cnblogs.com/00isok/p/10731834.html

时间: 2024-10-28 05:29:22

Codeforces 126B. Password (KMP)的相关文章

codeforces 126B Password

题意:给你一个字符串 ,问你既是它的前缀 ,又是它的后缀,且是在中间出线过的最长字串是什么 解题思路:KMP变形,不熟悉next写出来还是有点困难 解题代码: 1 // File Name: 126b.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月07日 星期六 15时23分51秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include

Codeforces 126B(kmp)

要点 头尾的最长相同只要一个kmp即可得,于是处理中间部分 扫一遍记录一下前缀的每个位置是否存在一个中间串跟它相同,见代码 如果当前没有,接着用Next数组去一找即可 #include <cstdio> #include <cstring> const int maxn = 1e6 + 5; char s[maxn]; int Next[maxn], Has[maxn], flag; int main() { scanf("%s", s + 1); int n

CodeForces 25E Test KMP

题目链接:点击打开链接 题意: 给定3个字符串,进行拼接 重复的一段可以覆盖,问拼接后最小的长度(若一个串s1是s2的子串,则s1可以认为嵌入了s2内,不需要进行拼接 思路: kmp搞一下. #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <math.h> #include <set> using name

Codeforces A. Password(KMP的nxt跳转表)

题目描述: Password time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Asterix, Obelix and their temporary buddies Suffix and Prefix has finally found the Harmony temple. However, its doors were f

codeforces #30E Tricky and Clever Password KMP+Manacher+二分

题目大意:给定一个字符串S,要求分成A+prefix+B+middle+C+suffix6段,满足: |prefix|=|suffix| |middle|为奇数 prefix+middle+suffix为回文串 除middle外所有段长度都可以为0 要求最大化|prefix|+|middle|+|suffix|,输出一组方案(|prefix|=|suffix|=0时只输出middle) 首先我们发现suffix串是顶着右端点的,因此我们可以枚举|suffix| 对于每个|suffix|我们需要求

【Codeforces 126B】Password

[链接] 我是链接,点我呀:) [题意] 给你一个字符串s 让你从中选出来一个字符串t 这个字符串t是s的前缀和后缀 且在除了前缀和后缀之外的中间部位出现过. 且要求t的长度最长. 让你输出这个字符串t [题解] KMP的应用 f[i]就是以i为结尾的后缀能匹配的最长前缀的长度 因此只要知道f[n]的值. 然后在做kmp的时候,看看中间有没有哪个时刻能匹配到长度为f[n]的前缀就好(开个数组标记一下就好); 如果没有就让j = f[f[n]] 直到匹配不到为止. [代码] import java

126B Password[扩展kmp学习]

题目大意 给你一个字符串,求它的一个子串使得这个子串即使前缀又是后缀又出现在不是前缀且不是后缀的地方 分析 扩展kmp就是定义z[i]表示i~n的子串与整个串的最长公共前缀的长度是z[i] 所以这个题就是找到一个位置使得z[i]=n-i+1 这样保证了是前缀和后缀 然后再判断之前是否有一个z[j]=z[i] 有的话代表这个长度的串在中间也出现过 直接输出这个即可 代码 #include<iostream> #include<cstdio> #include<cstring&g

Codeforces 526D Tanya and Password kmp

题意:给你一个字符串 ,问你前对于任意一个前缀能不能组成  A+B+A+B...+B+A 这种形式. 解题思路:在next数组上面乱搞,判断前缀是否循环 ,循环是否为K还是K+1,为K的时候往后DP看最多能符合条件的前缀串. 解题代码: 1 // File Name: d.cpp 2 // Author: darkdream 3 // Created Time: 2015年04月06日 星期一 15时36分38秒 4 5 #include<vector> 6 #include<list&

codeforces 126B

Asterix, Obelix and their temporary buddies Suffix and Prefix has finally found the Harmony temple. However, its doors were firmly locked and even Obelix had no luck opening them. A little later they found a string s, carved on a rock below the templ