CodeForces 126B Password】的更多相关文章

Codeforces 126B. Password 题意:一个字符串,找出最长的子串t,它既是前缀又是后缀,还出现在中间.输出t,不存在则输出Just a legend. 思路:利用KMP算法处理出next数组,由next数组的意义可以知道i为尾的最长相同前缀后缀.则ne[n-1],ne[ne[n-1]],ne[ne[ne[n-1]]]......均为可能的解,且长度递减,为了高效的逐一验证,则需要预处理出整个字符串有多少个与该前缀相同的子串.用到DP思想,cnt[next[i]]+=cnt[i…
题目链接:http://codeforces.com/problemset/problem/126/B 题目大意: 多组数据每组给定1个字符串S,问是否存在S的一个尽量长的子串,同时是S的前缀和后缀,并且在S的中间出现过(即非前缀也非后缀). 分析: 利用KMP的next数组. 首先next[i]表示该位(不包括)往前数next[i]位恰好构成字符串S的一个前缀,假设字符串长度为len,那next[len]就表示S长为next[len]的后缀正好是S的前缀,恰好就是题目说的公共前后缀,于是想知道…
<题目链接> 题目大意:给定一个字符串,从中找出一个前.中.后缀最长公共子串("中"代表着既不是前缀,也不是后缀的部分). 解题分析:本题依然是利用了KMP中next数组的性质.具体做法见代码. #include <bits/stdc++.h> using namespace std; ; char str[N]; int vis[N],nxt[N]; void getNext(int len){ ,k=-; nxt[]=-; while(j<len){…
题意 给定一个字符串 \(s\) ,求一个子串 \(t\) 满足 \(t\) 是 \(s\) 的前缀.后缀且在除前缀后缀之外的地方出现过. \(1 \leq |s| \leq 10^6\) 思路 \(\text{Z}\)算法是一个和 \(\text{Manacher}\)算法很像的字符串算法,功能是求出一个 \(z\) 数组,代表以 \(i\) 开头的后缀同整个串的 \(\text{lcp}\) . 首先回顾一下 \(\text{Manacher}\)算法的流程. int pos,r=0; FO…
[链接] 我是链接,点我呀:) [题意] 给你一个字符串s 让你从中选出来一个字符串t 这个字符串t是s的前缀和后缀 且在除了前缀和后缀之外的中间部位出现过. 且要求t的长度最长. 让你输出这个字符串t [题解] KMP的应用 f[i]就是以i为结尾的后缀能匹配的最长前缀的长度 因此只要知道f[n]的值. 然后在做kmp的时候,看看中间有没有哪个时刻能匹配到长度为f[n]的前缀就好(开个数组标记一下就好); 如果没有就让j = f[f[n]] 直到匹配不到为止. [代码] import java…
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…
题目描述: 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 题目传送门 & 洛谷题目传送门 一个远古场的 *2800,在现在看来大概 *2600 左右罢( 不过我写这篇题解的原因大概是因为这题教会了我一个套路罢( 首先注意到每次翻转的是一个区间,那么我们可以考虑它的差分序列(这就是这题教会我的套路,碰到区间操作有关的问题不妨考虑它的差分序列,这样可将影响多个元素的区间操作转化为 \(2\) 个单点操作,其实第一次碰见这个套路是在这个题,可是由于当时比较 naive 没能及时补题并整理这些方法),那么每次操作显然是将差分序列上两个单点…
要点 头尾的最长相同只要一个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…
题目大意 给你一个字符串,求它的一个子串使得这个子串即使前缀又是后缀又出现在不是前缀且不是后缀的地方 分析 扩展kmp就是定义z[i]表示i~n的子串与整个串的最长公共前缀的长度是z[i] 所以这个题就是找到一个位置使得z[i]=n-i+1 这样保证了是前缀和后缀 然后再判断之前是否有一个z[j]=z[i] 有的话代表这个长度的串在中间也出现过 直接输出这个即可 代码 #include<iostream> #include<cstdio> #include<cstring&g…