#include using namespace std; #define int long long #define rep(i,n) for(int i=0;i<(n);i++) #define pb push_back #define all(v) (v).begin(),(v).end() #define fi first #define se second typedef vectorvint; typedef pairpint; typedef vectorvpint; templateinline void chmin(A &a,B b){if(a>b)a=b;} templateinline void chmax(A &a,B b){if(a>=1; } return ret; } int fact[222222]; int inv[222222]; int P(int n,int k){ return fact[n]*inv[n-k]%mod; } int C(int n,int k){ return fact[n]*inv[k]%mod*inv[n-k]%mod; } int N; string S[2222]; typedef unsigned long long ull; const ull p=1000000009; vectorH[2222]; signed main(){ fact[0]=1; for(int i=1;i<222222;i++)fact[i]=fact[i-1]*i%mod; inv[222222-1]=mpow(fact[222222-1],mod-2); for(int i=222222-2;i>=0;i--)inv[i]=inv[i+1]*(i+1)%mod; cin>>N; rep(i,N)cin>>S[i]; rep(i,N){ H[i].pb(0); rep(j,S[i].size()){ H[i].pb(H[i].back()*p+S[i][j]); } } int ans[2222]={}; rep(i,N){ vint lis; rep(j,N){ if(i==j)continue; int lb=0,ub=min(S[i].size(),S[j].size())+1; while(ub-lb>1){ int mid=(ub+lb)/2; if(H[i][mid]==H[j][mid])lb=mid; else ub=mid; } lis.pb(ub); } sort(all(lis)); reverse(all(lis)); vint cost,cnt; rep(j,lis.size()){ if(j==0||lis[j-1]!=lis[j]){ cost.pb(lis[j]); cnt.pb(N-1-j); } } for(int k=1;k<=N;k++){ if(k==N){ ans[k]=(ans[k]+fact[k-1])%mod; continue; } for(int j=0;j=N-k)tmp=(tmp-C(cnt[j+1],N-k)+mod)%mod; ans[k]=(ans[k]+tmp*cost[j]%mod*fact[k-1])%mod; } } } for(int k=1;k<=N;k++){ ans[k]=(ans[k]+ans[k-1]*(N-k+1))%mod; cout<