这一题把哈希卡的死死的啊..

P1026 [NOIP2001 提高组] 统计单词个数

https://www.luogu.org/record/show?rid=4064919
by SGOI_Aromyase @ 2017-10-29 08:36:38


https://www.luogu.org/record/show?rid=4064757
by SGOI_Aromyase @ 2017-10-29 08:37:07


表示 unsinged long long 美滋滋 ```cpp #include <iostream> #include <algorithm> #define N 220 #define M 10 #define K 60 #define P 193 using namespace std; int f[N][K], g[N][N], h[N]; unsigned long long a[M]; unsigned long long Hash(string s) { int i; unsigned long long r; for(i = r = 0;i < (signed)s.size();i ++) r = r * P + s[i]; return r; } int main() { int n, m, k; string s, p; int i, j, t; unsigned long long v; cin >> n >> k; for(s = " ";n --;) { cin >> p; s += p; } n = s.size() - 1; cin >> m; for(i = 1;i <= m;i ++) { cin >> p; a[i] = Hash(p); } for(i = 1;i <= n;i ++) for(j = i, h[i] = n + 1;j <= n;j ++) { v = Hash(s.substr(i, j - i + 1)); for(t = 1;t <= m;t ++) if(v == a[t]) { h[i] = j; break; } if(h[i] <= n) break; } for(i = 1;i <= n;i ++) for(j = i;j <= n;j ++) for(t = i, g[i][j] = g[i][j - 1];t <= j;t ++) if(h[t] == j) g[i][j] ++; for(i = 1;i <= k;i ++) f[0][i] = -(n + 1); for(i = 1;i <= n;i ++) for(j = 1;j <= k;j ++) for(t = 1, f[i][j] = -(n + 1);t <= i;t ++) f[i][j] = max(f[i][j], f[t - 1][j - 1] + g[t][i]); cout << f[n][k] << endl; return 0; } ```
by gorokokoro @ 2017-10-29 08:37:48


对对对确实是这样……
by 颜伟业_C_Asm @ 2018-02-20 14:48:29


|