1 条题解
-
0
#include <bits/stdc++.h> #define ull unsigned long long using namespace std; int n; int len[10]; string s[10]; ull BASE = 173; ull bPow[2005]; ull hsh[10][2005]; set<ull> se[10]; bool check(int L) { for (int i = 1; i <= n; i++) se[i].clear(); for (int i = 1; i <= n - 1; i++) { for (int j = 1; j + L - 1 <= len[i]; j++) { ull nowHash = hsh[i][j + L - 1] - hsh[i][j - 1] * bPow[L]; se[i].insert(nowHash); } } for (int j = 1; j + L - 1 <= len[n]; j++) { ull nowHash = hsh[n][j + L - 1] - hsh[n][j - 1] * bPow[L]; bool flag = true; for (int k = 1; k <= n - 1; k++) { if (se[k].find(nowHash) == se[k].end()) { flag = false; break; } } if (flag) return true; } return false; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n; for (int i = 1; i <= n; i++) { cin >> s[i]; len[i] = s[i].size(); s[i] = "^" + s[i] + "$"; } // build Hash bPow[0] = 1; for (int i = 1; i <= 2000; i++) bPow[i] = bPow[i - 1] * BASE; for (int i = 1; i <= n; i++) for (int j = 1; j <= len[i]; j++) hsh[i][j] = hsh[i][j - 1] * BASE + (s[i][j] - 'a' + 1); // bs int l = 0; int r = len[1]; int ans = 0; while (l <= r) { int mid = (l + r) / 2; if (check(mid)) { ans = mid; l = mid + 1; } else { r = mid - 1; } } cout << ans << endl; return 0; }
信息
- ID
- 1360
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 4
- 标签
- 递交数
- 10
- 已通过
- 4
- 上传者