func_code_string: #include <bits/stdc++.h>   #pragma GCC optimize( O3 )   #pragma GCC target( sse4 )   using namespace std;   using ii = pair<int, int>;   using ll = long long;   const int N = 3000 + 5;   const int mod = 1e9 + 7;   string source[N], target[N];   int n;   ii ranges[N];   vector<int> FAIL(string pat) {     int m = pat.size();     vector<int> F(m + 1);     int i = 0, j = -1;     F[0] = -1;     while (i < m) {       while (j >= 0 && pat[i] != pat[j]) j = F[j];       i++, j++;       F[i] = j;     }     return F;   }   bool check(string a, string b, string s, string t) {     vector<int> F = FAIL(s);     int i = 0, j = 0;     int n = a.size();     int m = s.size();     while (i < n) {       while (j >= 0 && a[i] != s[j]) j = F[j];       i++, j++;       if (j == m) {         int idx = i - j;         for (int k = 0; k < m; k++) {           a[k + idx] = t[k];         }         break;       }     }     return a == b;   }   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cin >> n;     for (int i = 0; i < n; i++) cin >> source[i];     for (int i = 0; i < n; i++) cin >> target[i];     string s, t;     string prefix, suffix;     for (int i = 0; i < n; i++) {       if (source[i] != target[i]) {         int l = -1, r = -1;         for (int j = 0; j < source[i].size(); j++) {           if (source[i][j] != target[i][j]) r = j;           if (source[i][j] != target[i][j] && l == -1) l = j;         }         ranges[i] = {l, r};         if (s.empty()) {           s = source[i].substr(l, r - l + 1);           t = target[i].substr(l, r - l + 1);           prefix = source[i].substr(0, l);           suffix = source[i].substr(r + 1);           reverse(prefix.begin(), prefix.end());         } else {           if (s != source[i].substr(l, r - l + 1) ||               t != target[i].substr(l, r - l + 1)) {             cout <<  NO n ;             return 0;           }           string cprefix = source[i].substr(0, l);           string csuffix = source[i].substr(r + 1);           reverse(cprefix.begin(), cprefix.end());           string p, ss;           for (int j = 0;                j < min(cprefix.size(), prefix.size()) && cprefix[j] == prefix[j];                j++) {             p.push_back(prefix[j]);           }           for (int j = 0;                j < min(csuffix.size(), suffix.size()) && csuffix[j] == suffix[j];                j++) {             ss.push_back(suffix[j]);           }           prefix = p;           suffix = ss;         }       }     }     reverse(prefix.begin(), prefix.end());     s = prefix + s + suffix;     t = prefix + t + suffix;     for (int i = 0; i < n; i++) {       if (!check(source[i], target[i], s, t)) {         cout <<  NO n ;         return 0;       }     }     cout <<  YES n ;     cout << s <<   n ;     cout << t <<   n ;     return 0;   }   