B. Password(KMP)

传送门

题意:

Asterix,Obelix和他们的临时伙伴Suffix、Prefix已经最终找到了和谐寺。然而和谐寺大门紧闭,就连Obelix的运气也没好到能打开它。

不久他们发现了一个字符串S(|S|<=1000000),刻在和谐寺大门下面的岩石上。Asterix猜想那一定是打开寺庙大门的密码,于是就大声将字符串朗读了出来,然而并没有什么事发生。于是Asterix又猜想密码一定是字符串S的子串T。

Prefix认为T是S的前缀,Suffix认为T是S的后缀,Obelix却认为T应该是S中的某一部分,也就是说,T既不是S的前缀,也不是S的后缀。

Asterix选择子串T来满足所有伙伴们的想法。同时,在所有可以被接受的子串变形中,Asterix选择了最长的一个(因为Asterix喜欢长的字符串)当Asterix大声读出子串T时,寺庙的大门开了。 (也就是说,你需要找到既是S的前缀又是S的后缀同时又在S中间出现过的最长子串)

现在给你字符串S,你需要找到满足上述要求的子串T。

输入格式:

一个长度在[1,1000000]间的只包含小写字母的字符串S。

输出格式:

输出子串T,如果T不存在,输出 "Just a legend",不包含引号。

思路:

就是找出一个最长子串,这个子串在开头结尾和中间都出现过。

AC代码:

//
//                                                    ................                                                .................,`..,`.................
//                                                    .....=^..=^..=^.                                                .=^..=^..=^..=^..=^..=^..=^...*.........
//                                            ...*,/\`,/\^,\..,\..,\..,/\`,/\`,/\`...*...*                        ...*,\..,\..,\..,\..,\..,\..,\..=^=^,`,`,`,`
//                                            .,].=^..=^=^,`=^,`=^,`=^=^..=^..=^...,]..,].                        .,].,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^*.........
//                                    .....................,`..,`..,`.....................................        .....,`..,`..,`..,`..,`..,`..,`.
//                                    .=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.        .=^..=^..=^..=^..=^..=^.........
//                                ,[\^,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,/\`,/\`,\..,\..,\..,\..,\..,\..,`,`
//                                ,/*.,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^..=^..,`=^,`=^,`=^,`=^,`=^,`=^....
//                        .............,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..........,`..,`..,`..,`..,`..,`.
//                        .....=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.........
//                    ...*,/\^,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,`,`
//                    .,].=^=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^....
//                .............,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.........
//                .=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.
//            ...*,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,/\`...*...*
//            .,].,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^...,]..,].
//        .........,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.....................................
//        .=^..=^..............................................=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.....
//    ...*,\..,\...\/`.\/`.\/`.\/`,`,`,`,`,`,`,`,`.\/`.\/`.\/`,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..=/\`,/\`...*
//    .,].,`=^,`=^.[,`.[,`.[,`.[,`.................[,`.[,`.[,`,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^=^=^...,].
//        .,`..,`.                                            .,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.................
//        ........                                            .............................=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.....
//                                                                        ,`,`,`,`.\/`.\/`,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..=^..
//                                                                        .........[,`.[,`,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^..
//                                                                                    .....,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.....
//                                                                                    .=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.
//                                                                                ,[\^,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..
//                                                                                ,/*.,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^
//                                                                            .........,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.
//                                                                            .=^..=^..=^..=^..=^..=^..=^..=^.. ...........=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.
//                                                                        ...*,\..,\..,\..,\..,\..,\..,\..,\..=^=^.\/`.\/`,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..
//                                                                        .,].,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^*..[,`.[,`,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^
//                                                                    .........,`..,`..,`..,`..,`..,`..,`..,`.            .,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.
//                                                                    .....=^..=^..=^..=^..=^..=^..=^.........            .............................................=^..=^..=^..=^..=^.
//                                                                    ,/\^,\..,\..,\..,\..,\..,\..,\..,`,`                                                        .@=^,\..,\..,\..,\..,\..
//                                                                    =^=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^....                                                        ,[\/,`=^,`=^,`=^,`=^,`=^
//                                                                .........,`..,`..,`..,`..,`..,`..,`.                                                                .,`..,`..,`..,`..,`.
//                                                                .=^..=^..=^..=^..=^..=^..=^..=^..=^.                                                                .=^..=^..=^.. ......
//                                                            ,[\^,\..,\..,\..,\..,\..,\..,\..,\..,\..                                                                ,\..,\..,\..=^=^,`,`
//                                                            ,/*.,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^                                                                ,`=^,`=^,`=^=^*.....
//                                                        .........,`..,`..,`..,`..,`..,`..,`..,`..,`*                                                                .,`..,`..,`.
//                                                        .....=^..=^..=^..=^..=^..=^..=^..=^..=^....*                                                                .=^.. ......
//                                                        ,/\^,\..,\..,\..,\..,\..,\..,\..,\..,\..=^..                                                                ,\..=^=^,`,`
//                                                        =^=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^..                                                                ,`=^=^*.....
//                                                        .....,`..,`..,`..,`..,`..,`..,`..,`..,`....*                                                                .,`.
//                                                        .=^..=^..=^..=^..=^..=^..=^..=^..=^..=^...*.                                                                ....
//                                                        ,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..=^..
//                                                        ,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^..
//                                                        .,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.....
//                                                        .........=^..=^..=^..=^..=^..=^..=^..=^.....
//                                                            .\/`,\..,\..,\..,\..,\..,\..,\..,\..,`,`
//                                                            .[,`,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^....
//                                                                .,`..,`..,`..,`..,`..,`..,`..,`.
//                                                                ................................
//                                                                    ,`,`.\/`.\/`.\/`,`,`,`,`
//   
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
char a[N];
int ne[N];
void solve(){
	int i,j=0;
	cin>>(a+1);
	int len=strlen(a+1);
	for(i=2;i<=len;i++){      //与自己匹配  
		while(j&&a[i]!=a[j+1]) j=ne[j];
		if(a[i]==a[j+1]) j++;
		ne[i]=j;	
	}
	int flag=0;
	int le=ne[len];           //le记录最大长度 
	int maxl=0;
	while(le){
		for( i=2,j=0;i<=len-1;i++){
			while(j&&a[i]!=a[j+1]) j=ne[j];
			if(a[i]==a[j+1]) j++;
			if(j==le){
				flag=1;
				break;
			}
		} 
		if(flag==1) break;
		le=ne[le];
	}
	if(!le){
		cout<<"Just a legend\n";
	}
	else {
		for(int i=1;i<=le;i++){
			cout<<a[i];
		}
		cout<<"\n";
	}
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int t=1;
//	cin>>t;
	while(t--){
		solve();
	}
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值