//In the name of GOD
#include <bits/stdc++.h>
using namespace std;
#define f first
#define s second
const int maxN=3e3+5;
int n, m, lps[maxN][maxN], tmp[maxN]={-1};
string s, t, ts;
pair<int, pair<int, int>> ans;
void solve(bool rt, bool rs){
for (int i=m; i>=1; i--){
for (int j=i, cur=j-1; j<=n+m+1; j++, cur=j-1){
while(ts[tmp[cur-i+1]+i]!=ts[j] and tmp[cur-i+1]>=0) cur=tmp[cur-i+1]+i-1;
tmp[j-i+1]=tmp[cur-i+1]+1;
if(j>m+1) lps[i][j-m-1]=tmp[j-i+1];
}
for (int j=1; j<=n; j++){
int x=lps[i][j]+lps[i+lps[i][j]][j-lps[i][j]];
if(x>ans.f) ans={x, {(!rt ? i-1 : m-i-x+1) , (!rs ? j-x : n-j)}};
}
}
}
int main(){
cin >>s >>t;
n=s.size(), m=t.size();
ts='.'+t+'.'+s;
solve(false, false);
reverse(ts.begin()+m+2, ts.end());
solve(false, true);
reverse(ts.begin()+1, ts.begin()+m+1);
solve(true, true);
reverse(ts.begin()+m+2, ts.end());
solve(true, false);
cout <<ans.f <<endl <<ans.s.s <<' ' <<ans.s.f;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |