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<set>
 9 #include<deque>
10 #include<stack>
11 #include<bitset>
12 #include<algorithm>
13 #include<functional>
14 #include<numeric>
15 #include<utility>
16 #include<sstream>
17 #include<iostream>
18 #include<iomanip>
19 #include<cstdio>
20 #include<cmath>
21 #include<cstdlib>
22 #include<cstring>
23 #include<ctime>
24 #define LL long long
25
26 using namespace std;
27 char str[1000005];
28 int dp[1000005];
29 int hs[1000005];
30 void getnext(char *p,int next[])
31 {
32    int pLen =strlen(p);
33    next[0] = -1;
34    int k = -1;
35    int j = 1;
36    while(j < pLen )
37    {
38      if(k == -1 || p[j] == p[k+1])
39      {
40       if(p[j] == p[k+1])
41       {
42          next[j] = k + 1;
43          k ++;
44          j ++ ;
45       }else{
46          next[j] = -1;
47          j++;
48       }
49      }
50      else {
51         k = next[k] ;
52      }
53    }
54 }
55 int main(){
56    scanf("%s",str);
57    getnext(str,dp);
58    int len = strlen(str);
59    for(    int i = 0;i < len; i++)
60    {
61      /*if(dp[i] == 0 && str[i] == str[0])
62      {
63
64      }
65      else
66        dp[i]--;
67      *///printf("%d ",dp[i]);
68        if(dp[i] != -1)
69        hs[dp[i]] ++;
70    }
71    if(dp[len-1] != -1)
72       hs[dp[len-1]] -- ;
73    while(hs[dp[len-1]] ==0 && dp[len-1] != -1)
74    {
75   //     printf("dp[len-1] = %d\n",dp[len-1]);
76        dp[len-1] = dp[dp[len-1]];
77    }
78   // printf("ans = %d\n",dp[len-1]);
79    int an = 0 ;
80    for(int i = len -2;i >= 1;i --)
81        if(dp[i] == dp[len -1])
82        {
83            an = 1 ;
84        }
85    if(an == 0 || dp[len -1] == -1 || (dp[len-1] ==0 && str[len-1] != str[0]))
86    {
87        printf("Just a legend\n");
88        return 0 ;
89    }
90    for(int i =0 ;i <= dp[len-1];i ++)
91        printf("%c",str[i]);
92
93 return 0;
94 }

时间: 2024-10-27 14:20:20

codeforces 126B Password的相关文章

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;

【Codeforces 126B】Password

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

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

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 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

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

Password Uva1262 KMP

D - Password Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 126B Description Asterix, Obelix and their temporary buddies Suffix and Prefix has finally found the Harmony temple. However,

Week SP1:2014/11/2

一直拖到现在才写,中间还有几道没看.. A:Aizu 0009 Prime Number:素数筛选,注意可能爆内存!!. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> typedef long long LL; using namespace std; #define REPF( i , a , b ) for (

codeforces 508 D. Tanya and Password (fleury算法)

codeforces 508 D. Tanya and Password (fleury算法) 题目链接: http://codeforces.ru/problemset/problem/508/D 题意: 给出n个长度为3的字符串,如:abc bca aab 如果一个字符串的长度为2的后缀等于,另外一个字符串的长度为2的前缀,则这两个字符串能连起来,比如:aabca,然后这n个字符串可以形成一个图,求图上的一条欧拉通路. 限制: 1 <= n <= 2*10^5,字符串里面有大写字母,小写字