結果
問題 | No.562 超高速一人かるた small |
ユーザー |
![]() |
提出日時 | 2017-08-26 00:09:41 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,447 ms / 3,000 ms |
コード長 | 1,829 bytes |
コンパイル時間 | 1,304 ms |
コンパイル使用メモリ | 118,380 KB |
実行使用メモリ | 253,240 KB |
最終ジャッジ日時 | 2024-10-15 16:52:00 |
合計ジャッジ時間 | 18,642 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 21 |
ソースコード
#include<iostream>#include<iomanip>#include<math.h>#include<vector>#include<algorithm>#include<set>#include<map>#include<queue>#include<stack>#include<string>#include<complex>#include<random>#include<time.h>#define INF 1000000000ll#define MOD 1000000007ll#define EPS 1e-8#define REP(i, m) for(long long i = 0; i < m; ++i)#define FOR(i, n, m) for(long long i = n; i < m; ++i)#define ALL(v) v.begin(), v.end()#define pb push_backusing namespace std;typedef long long ll;typedef pair<ll, ll> P;typedef long double ld;ll fact(ll a) {if(a==0) return 1;else return (a*fact(a-1))%MOD;}int main() {ios::sync_with_stdio(false);int n;cin>>n;vector<string> s(n);REP(i,n) cin>>s[i];vector<ll> res(n,0);vector<vector<ll> > dp(n,vector<ll>(1<<n,0));vector<vector<int> > icchi(n,vector<int>(n,0));REP(i,n) {REP(j,n) {if(i==j) continue;int pos=0;while(pos<s[i].size()&&pos<s[j].size()&&s[i][pos]==s[j][pos]) ++pos;icchi[i][j]=pos;}}vector<vector<int> > kyori(n,vector<int>(1<<n,0));for(int i=(1<<n)-1; i>=0; --i) {vector<int> p;vector<int> q;int buf=i;REP(k,n) {if(buf%2==1) {p.pb(k);}else q.pb(k);buf/=2;}for(int j=0; j<p.size(); ++j) {if(i==(1<<n)-1) {kyori[p[j]][i]=0;} else {kyori[p[j]][i]=max(kyori[p[j]][i^(1<<q[0])],icchi[p[j]][q[0]]);}}}REP(j,1<<n) {vector<ll> p;vector<ll> q;ll buf=j;REP(k,n) {if(buf%2==1) {p.pb(k);}else q.pb(k);buf/=2;}REP(i,p.size()) {ll foo=kyori[p[i]][j];++foo;foo*=fact(p.size()-1);dp[i][j]=foo%MOD;res[p.size()-1]+=dp[i][j];res[p.size()-1]%=MOD;}}REP(i,n) {if(i!=0) {res[i]=(res[i-1]*(n-i))%MOD+res[i];res[i]%=MOD;cout<<res[i]%MOD<<endl;}else cout<<res[i]%MOD<<endl;}}