func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 500010;   int n, m;   char a[maxn], b[maxn];   char s[maxn * 2], c[maxn * 3];   int z[maxn * 3];   int lcp[maxn];   int lcs[maxn];   void z_init(int len) {     int l = 1, r = 1;     z[1] = len;     for (int i = 2; i <= len; i++) {       if (i > r) {         l = i;         r = i;         while (r <= len && c[r - i + 1] == c[r]) r++;         z[i] = r - l;         r--;       } else {         int k = i - l + 1;         if (z[k] < r - i + 1)           z[i] = z[k];         else {           l = i;           while (r <= len && c[r - i + 1] == c[r]) r++;           z[i] = r - l;           r--;         }       }     }   }   void init() {     for (int i = 1; i <= m; i++) c[i] = s[i];     c[m + 1] =  # ;     for (int i = 1; i <= n; i++) c[m + 1 + i] = a[i];     c[n + m + 2] =   0 ;     z_init(n + m + 1);     for (int i = 1; i <= n; i++) lcp[i] = z[m + 1 + i];     for (int i = 1; i <= m; i++) c[i] = s[m + 1 - i];     c[m + 1] =  # ;     for (int i = 1; i <= n; i++) c[m + 1 + i] = b[n + 1 - i];     c[n + m + 2] =   0 ;     z_init(n + m + 1);     for (int i = 1; i <= n; i++) lcs[i] = z[m + 1 + n + 1 - i];   }   long long cnt[maxn * 2], sum[maxn * 2];   int lowbit(int x) { return x & (-x); }   void add(int v) {     int x = v;     while (x <= n) sum[x] += v, cnt[x]++, x += lowbit(x);   }   void sub(int v) {     int x = v;     while (x <= n) sum[x] -= v, cnt[x]--, x += lowbit(x);   }   long long get_sum(int x) {     long long res = 0;     while (x) res += sum[x], x -= lowbit(x);     return res;   }   long long get_cnt(int x) {     long long res = 0;     while (x) res += cnt[x], x -= lowbit(x);     return res;   }   int main() {     scanf( %d%d , &n, &m);     scanf( %s%s%s , a + 1, b + 1, s + 1);     init();     long long ans = 0;     for (int i = 1; i <= min(n, m - 1); i++) add(max(1, m - lcs[i]));     for (int i = 1, r; i <= n; i++) {       r = min(m - 1, lcp[i]);       ans += 1LL * (r + 1) * get_cnt(r) - get_sum(r);       sub(max(1, m - lcs[i]));       if (i + m - 1 <= n) add(max(1, m - lcs[i + m - 1]));     }     printf( %I64d n , ans);   }   