View difference between Paste ID: J5fkYCux and bn10DthY
SHOW: | | - or go back to the newest paste.
1
#include <bits/stdc++.h>
2
#include <ext/pb_ds/assoc_container.hpp>
3
4
using namespace __gnu_pbds;
5
using namespace std;
6
7
//#define int long long
8
#define ll long long
9
gp_hash_table<ll, int> mp;
10
11
int P=179,mod=1791791791;
12
13
void calc(vector<int> &h,string &s){
14
    h.resize(s.size()+1,0);
15
16
    for(int i=1;i<=s.size();i++){
17
        h[i]=((ll)h[i-1]*P+(s[i-1]-'a'+1))%mod;
18
    }
19
}
20
21
void getP(vector<int> &p,int n){
22
    p.resize(n+1,1);
23
24
    for(int i=1;i<p.size();i++){
25
        p[i]=((ll)p[i-1]*P)%mod;
26
    }
27
}
28
29
int res(int l,int r,vector<int> &h,vector<int> &p){
30
    return ((ll)h[r+1]+mod-((ll)h[l]*p[r-l+1])%mod)%mod;
31
}
32
33
signed main() {
34
35
    ios::ios_base::sync_with_stdio(false);
36
    cin.tie(0);
37
    cout.tie(0);
38
39
    int n,m;
40
    cin>>n>>m;
41
42
    vector<string> a(n);
43
    vector<vector<int> > h(n),sm(n+1,vector<int> (m+1,0));
44
    vector<int> p;
45
46
    for(int i=0;i<n;i++){
47
        cin>>a[i];
48
        calc(h[i],a[i]);
49
        for(int j=1;j<=m;j++){
50
            sm[i+1][j]=sm[i][j]+sm[i+1][j-1]-sm[i][j-1]+(a[i][j-1]-'a'+1);
51
        }
52
    }
53
54
    getP(p,max(n,m));
55
56
    vector<vector<int> > dp(n,vector<int> (m,0));
57
    int k;
58
    pair<int,int> ans1={-1,-1};
59
    pair<int,int> ans2={-1,-1};
60
    for(k=1;k<=min(n,m);k++){
61
        bool check=false;
62
        mp.clear();
63
        for(int i=0;i<n-k+1;i++){
64
            for(int j=0;j<m-k+1;j++){
65
                int r=j+k,b=i+k-1;
66
                int sum=sm[b][r]-sm[i][r]-sm[b][r-1]+sm[i][r-1];
67
                dp[i][j]=(((ll)dp[i][j]*P*P)%mod+(ll)res(j,j+k-1,h[i+k-1],p)+sum)%mod;
68
                int res=mp[dp[i][j]];
69
                if(res!=0){
70
                    ans1=make_pair(res/1000,res%1000);
71
                    ans2=make_pair(i+1,j+1);
72
                    check=true;
73
                }
74
                mp[dp[i][j]]=(ll)((i+1)*1000+(j+1));
75
            }
76
        }
77
78
        if(!check){
79
            break;
80
        }
81
    }
82
83
    if(k-1==0){
84
        cout<<0;
85
        return 0;
86
    }
87
    cout<<k-1<<endl;
88
    cout<<ans1.first<<" "<<ans1.second<<endl;
89
    cout<<ans2.first<<" "<<ans2.second<<endl;
90
91
}