B. Password
题意:
找最长的子串,在前缀、后缀以及中间(不包括首尾字符)出现过。
#include<bits/stdc++.h>
using namespace std;
void zft(string s) {
int n=(int)s.length();
vector<int>z(n);
for(int i=1,l=0,r=0;i<n;++i) {
if(i<=r&&z[i-l]<r-i+1) z[i]=z[i-l];
else {
z[i]=max(0,r-i+1);
while(i+z[i]<n&&s[z[i]]==s[i+z[i]]) ++z[i];
}
if(i+z[i]-1>r) l=i,r=i+z[i]-1;
}
int x(0),ans(0),a(0),b(0);
for(int i=1;i<n;++i) {
if(i+z[i]==n) {
if(z[i]>a) {
b=a;
a=z[i];
}
else if(z[i]>b) b=z[i];
}
else if(z[i]>x) x=z[i];
}
if(x>=a) ans=a;
else ans=b;
if(ans) cout<<s.substr(0,ans)<<'\n';
else cout<<"Just a legend\n";
}
int main() {
cin.sync_with_stdio(false);
cin.tie(nullptr),cout.tie(nullptr);
string s;
cin>>s;
zft(s);
}
z函数 文章被收录于专栏
null