# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
546331 | s_jaskaran_s | Necklace (Subtask 4) (BOI19_necklace4) | C++17 | 276 ms | 616 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
typedef long long ll;
typedef long double ld;
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
typedef tree<pair<int,int>,null_type,less<pair<int,int>>,rb_tree_tag,
tree_order_statistics_node_update> indexed_set;
#define endl '\n'
void zedd(string &s,string &t,int z[]){
t+='#';
z[0]=0;
int x=0,y=0;
for(int i=1;i<t.size();i++){
z[i]=max(0,min(z[i-x],y-i+1));
while(i+z[i]<t.size()&&t[z[i]]==t[z[i]+i]){
z[i]++;
x=i;
y=i+z[i]-1;
}
}
for(int i=0;i<s.size();i++){
z[i+t.size()]=max(0,min(z[i+t.size()-x],y-(i+(int)t.size())+1));
while(i+z[i+t.size()]<s.size()&&t[z[i+t.size()]]==s[z[i+t.size()]+i]){
z[i+t.size()]++;
x=i+t.size();
y=i+t.size()+z[i+t.size()]-1;
}
}
for(int i=0;i<s.size();i++){
z[i]=z[i+t.size()];
}
t.pop_back();
}
void kmp(string &s,string &t,int x[]){
if(t.size()==0){
for(int i=0;i<s.size();i++){
x[i]=0;
}
return;
}
int j=0;
s=t+'#'+s;
x[0]=0;
for(int i=1;i<s.size();i++){
while(j>0&&s[i]!=s[j]){
j=x[j-1];
}
if(s[i]==s[j]){
j++;
}
x[i]=j;
}
j=0;
for(int i=0;i<s.size()-t.size()-1;i++){
x[i]=x[i+t.size()+1];
}
s=s.substr(t.size()+1,s.size()-t.size()-1);
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string s,p,t;
cin>>s>>p;
for(int j=p.size()-1;j>=0;j--){
t+=p[j];
}
int z[s.size()+p.size()+1];
int y[s.size()+p.size()+1],x[s.size()+p.size()+1];
int ans=0;
int e,f;
for(int i=0;i<s.size();i++){
string r=s.substr(i,s.size()-i);
zedd(p,r,z);
r.clear();
for(int j=i-1;j>=0;j--){
r+=s[j];
}
kmp(t,r,y);
for(int j=0;j<p.size();j++){
x[j]=y[p.size()-j-1];
}
x[p.size()]=0;
for(int j=0;j<p.size();j++){
if(z[j]+x[j+z[j]]>ans){
ans=z[j]+x[j+z[j]];
e=i-x[j+z[j]];
f=j;
}
}
}
p=t;
t.clear();
for(int j=p.size()-1;j>=0;j--){
t+=p[j];
}
for(int i=0;i<s.size();i++){
string r=s.substr(i,s.size()-1-i);
zedd(p,r,z);
r.clear();
for(int j=i-1;j>=0;j--){
r+=s[j];
}
kmp(t,r,y);
for(int j=0;j<p.size();j++){
x[j]=y[p.size()-j-1];
}
x[p.size()]=0;
for(int j=0;j<p.size();j++){
if(z[j]+x[j+z[j]]>ans){
ans=z[j]+x[j+z[j]];
e=i-x[j+z[j]];
f=(int)p.size()-1-j-ans+1;
}
}
}
cout<<ans<<endl;
cout<<e<<" "<<f;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |