#include <bits/stdc++.h>
using namespace std;
string a, b, c, s;
const long long mod = 1000000007;
long long res[310000], sum;
int N, ar[310000], srt[310000], dad[310000];
int where[310000], lcp[310000], F[310000], S[310000], T[310000];
pair<int, int> as[310000];
vector<pair<int, int> > q;
int comp(const int &a, const int &b) { return as[a] < as[b]; }
int find(int x) {
  if (dad[x] == x) return x;
  return dad[x] = find(dad[x]);
}
int main() {
  cin >> a >> b >> c;
  N = a.size() + b.size() + c.size() + 2;
  s = " " + a + '#' + b + '0' + c;
  for (int i = 1; i <= N; i++) ar[i] = s[i];
  for (int z = 0; (1 << z) <= N; z++) {
    for (int i = 1; i <= N; i++)
      as[i] = pair<int, int>(ar[i],
                             ((i + (1 << z)) <= N) ? (ar[i + (1 << z)]) : (-1)),
      srt[i] = i;
    sort(srt + 1, srt + 1 + N, comp);
    pair<int, int> prev = pair<int, int>(-1, -1);
    for (int i = 1, cnt = 0; i <= N; i++) {
      if (as[srt[i]] != prev) {
        prev = as[srt[i]];
        ++cnt;
      }
      ar[srt[i]] = cnt;
    }
  }
  for (int i = 1; i <= N; i++) where[ar[i]] = i;
  for (int i = 1, ss = 0; i <= N; i++) {
    if (ar[i] == N) continue;
    int x = where[ar[i] + 1];
    while (s[i + ss] == s[x + ss] && i + ss <= N && x + ss <= N) ss++;
    lcp[ar[i]] = ss;
    q.push_back(pair<int, int>(ss, ar[i]));
    if (ss) ss--;
  }
  for (int i = 1; i <= N; i++) {
    dad[i] = i;
    if (where[i] <= a.size())
      F[i] = 1;
    else if (where[i] <= a.size() + b.size() + 1)
      S[i] = 1;
    else
      T[i] = 1;
  }
  sort(q.begin(), q.end());
  reverse(q.begin(), q.end());
  int M = min(a.size(), min(b.size(), c.size()));
  for (int i = M, j = 0; i; i--) {
    while (j < (int)q.size() && q[j].first >= i) {
      int x = q[j].second, y = q[j].second + 1;
      long long pl = -1LL * F[find(x)] * S[find(x)] * T[find(x)];
      pl -= 1LL * F[find(y)] * S[find(y)] * T[find(y)];
      F[find(x)] += F[find(y)];
      S[find(x)] += S[find(y)];
      T[find(x)] += T[find(y)];
      dad[find(y)] = find(x);
      pl += 1LL * F[find(x)] * S[find(x)] * T[find(x)];
      sum = (sum + pl) % mod;
      j++;
    }
    res[i] = sum;
  }
  for (int i = 1; i <= M; i++) printf("%d ", res[i]);
  return 0;
}
