#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long int ll; typedef pair pii; typedef tuple t3; using namespace std; int N; string S[202]; ll dp[1<<20]; ll mod=1000000007; ll fact[21]; ll ret[21]; int cost[20][20]; void solve() { cin>>N; for(int i = 0;i < N;i++) { cin >> S[i]; } for(int x = 0;x < N;x++) { for(int y = 0;y < N;y++) { //2者間コストの計算 cost[x][y]=1; while(cost[x][y]<=S[x].size() && cost[x][y]<=S[y].size() && S[x][cost[x][y]-1]==S[y][cost[x][y]-1]) { cost[x][y]++; } } } fact[0]=1; for(int i = 0;i < N;i++) { //階乗計算 fact[i + 1] = fact[i] * (i+1)%mod; } for(int mask=0;mask<1<