結果
| 問題 |
No.562 超高速一人かるた small
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2017-08-25 22:54:31 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 887 ms / 3,000 ms |
| コード長 | 1,191 bytes |
| コンパイル時間 | 1,106 ms |
| コンパイル使用メモリ | 82,484 KB |
| 最終ジャッジ日時 | 2025-01-05 02:29:34 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 21 |
ソースコード
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
constexpr long long mod = 1e9 + 7;
int main() {
int n;
cin >> n;
vector<string> s(n);
for (int i = 0; i < n; i++) {
cin >> s[i];
}
vector<vector<int>> lcp(n, vector<int>(n));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
int k = 0;
while (k < s[i].size() && k < s[j].size() && s[i][k] == s[j][k]) k++;
lcp[i][j] = k;
}
}
vector<long long> dp(1 << n);
vector<long long> way(1 << n);
way[0] = 1;
for (int i = 0; i < 1 << n; i++) {
for (int j = 0; j < n; j++) {
if (i >> j & 1) continue;
int l = 0;
for (int k = 0; k < n; k++) {
if (j == k) continue;
if (~i >> k & 1) {
l = max(l, lcp[j][k]);
}
}
(dp[i | 1 << j] += dp[i] + (l + 1) * way[i]) %= mod;
(way[i | 1 << j] += way[i]) %= mod;
}
}
vector<long long> ans(n + 1);
for (int i = 0; i < 1 << n; i++) {
int cnt = 0;
for (int j = 0; j < n; j++) {
cnt += i >> j & 1;
}
ans[cnt] += dp[i];
}
for (int i = 1; i <= n; i++) {
cout << ans[i] % mod << endl;
}
}