| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 546330 | s_jaskaran_s | Necklace (Subtask 4) (BOI19_necklace4) | C++17 | 307 ms | 444 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=p.size()-1-j-ans+1;
            }
        }
    }
    cout<<ans<<endl;
    cout<<e<<" "<<f;
}
Compilation message (stderr)
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
