#include <bits/stdc++.h>   using namespace std;   template <typename T>   void pv(T a, T b) {     for (T i = a; i != b; ++i) cout << *i <<    ;     cout << endl;   }   template <typename T>   void chmin(T &t, const T &f) {     if (t > f) t = f;   }   template <typename T>   void chmax(T &t, const T &f) {     if (t < f) t = f;   }   int in() {     int x;     scanf( %d , &x);     return x;   }   const long long MO = 1000000007;   namespace SA {   int n;   char t[300010];   int ki[300010], ik[300010], is[300010], hh;   bool cmp(const int &a, const int &b) {     return (a == b)           ? 0            : (ik[a] != ik[b]) ? (ik[a] < ik[b])                               : (ik[a + hh] < ik[b + hh]);   }   void makeSA() {     n = strlen(t);     int i;     for (i = 0; i <= n; ++i) ik[ki[i] = i] = t[i];     is[0] = is[n] = hh = 0;     sort(ki, ki + n + 1, cmp);     for (hh = 1; is[n] != n; hh <<= 1) {       sort(ki, ki + n + 1, cmp);       for (i = 0; i < n; ++i) is[i + 1] = is[i] + (cmp(ki[i], ki[i + 1]) ? 1 : 0);       for (i = 0; i <= n; ++i) ik[ki[i]] = is[i];     }   }   int lcp[300010];   void makeHA() {     int h = 0, i, j;     for (i = 0; i < n; ++i) {       for (j = ki[ik[i] - 1]; t[j + h] == t[i + h]; ++h)         ;       lcp[ik[i] - 1] = h;       if (h) --h;     }   }   }  // namespace SA   int LA, LB, LC;   long long ans[300010];   int eventsLen;   pair<int, int> events[300010];   int uf[300010];   long long cnt[300010][3];   long long prodSum;   int root(int u) { return (uf[u] < 0) ? u : (uf[u] = root(uf[u])); }   void conn(int u, int v) {     u = root(u);     v = root(v);     if (u == v) return;     if (uf[u] > uf[v]) swap(u, v);     uf[u] += uf[v];     uf[v] = u;     prodSum -= cnt[u][0] * cnt[u][1] * cnt[u][2];     prodSum -= cnt[v][0] * cnt[v][1] * cnt[v][2];     cnt[u][0] += cnt[v][0];     cnt[u][1] += cnt[v][1];     cnt[u][2] += cnt[v][2];     prodSum += cnt[u][0] * cnt[u][1] * cnt[u][2];   }   int main() {     using namespace SA;     for (; ~scanf( %s , t);) {       LA = strlen(t);       t[LA] =  0 ;       scanf( %s , t + LA + 1);       LB = strlen(t + LA + 1);       t[LA + 1 + LB] =  1 ;       scanf( %s , t + LA + 1 + LB + 1);       LC = strlen(t + LA + 1 + LB + 1);       t[LA + 1 + LB + 1 + LC] =  2 ;       t[LA + 1 + LB + 1 + LC + 1] = 0;       makeSA();       makeHA();       eventsLen = 0;       for (int i = 0; i < n; ++i) {         events[eventsLen++] = make_pair(lcp[i], i);       }       sort(events, events + eventsLen);       reverse(events, events + eventsLen);       fill(uf, uf + n + 1, -1);       for (int i = 0; i <= n; ++i) {         cnt[i][0] = 0;         cnt[i][1] = 0;         cnt[i][2] = 0;         if (0 <= ki[i] && ki[i] < LA) {           cnt[i][0] = 1;         } else if (LA + 1 <= ki[i] && ki[i] < LA + 1 + LB) {           cnt[i][1] = 1;         } else if (LA + 1 + LB + 1 <= ki[i] && ki[i] < LA + 1 + LB + 1 + LC) {           cnt[i][2] = 1;         }       }       prodSum = 0;       for (int h = 0, k = n; k >= 0; --k) {         for (; h < eventsLen && events[h].first == k; ++h) {           const int i = events[h].second;           conn(i, i + 1);         }         ans[k] = prodSum;       }       const int ansLen = min({LA, LB, LC});       for (int k = 1; k <= ansLen; ++k) {         if (k > 1) printf(   );         printf( %d , (int)(ans[k] % MO));       }       puts(  );     }     return 0;   }