记录编号 213879 评测结果 AAAAAAAAAA
题目名称 [USACO Dec06]产奶的模式 最终得分 100
用户昵称 Gravatarassassain 是否通过 通过
代码语言 C++ 运行时间 0.011 s
提交时间 2015-12-13 17:17:41 内存使用 4.72 MiB
显示代码纯文本
  1. #define MAXN 20010UL
  2. #include <cstdio>
  3.  
  4. using namespace std;
  5.  
  6. int hd, tl, ans, sa[MAXN], rk[MAXN], wa[MAXN], wb[MAXN], wv[MAXN], w[MAXN], lie[MAXN], ht[MAXN], ws[1000010];
  7.  
  8. bool CP(int *r,int x,int y, int l) {
  9. return r[x]==r[y]&&r[x+l]==r[y+l];
  10. }
  11.  
  12. void HZ(int *w,int *sa,int n,int m) {
  13. int i, j, p, *x = wa, *y = wb, *t;
  14. for(i = 0 ; i <= m ; ++ i) ws[i] = 0;
  15. for(i = 0 ; i < n ; ++ i) ++ ws[x[i] = w[i]];
  16. for(i = 1 ; i <= m ; ++ i) ws[i] += ws[i-1];
  17. for(i = n-1 ; i >= 0 ; -- i) sa[-- ws[x[i]]] = i;
  18. for(j = 1, p = 1 ; p < n ; j *= 2, m = p) {
  19. for(p = -1, i = n-j ; i < n ; ++ i) y[++ p] = i;
  20. for(i = 0 ; i < n ; ++ i) if(sa[i] >= j) y[++ p] = sa[i]-j;
  21. for(i = 0 ; i < n ; ++ i) wv[i] = x[y[i]];
  22. for(i = 0 ; i <= m ; ++ i) ws[i] = 0;
  23. for(i = 0 ; i < n ; ++ i) ++ ws[wv[i]];
  24. for(i = 1 ; i <= m ; ++ i) ws[i] += ws[i-1];
  25. for(i = n-1 ; i >= 0 ; -- i) sa[-- ws[wv[i]]] = y[i];
  26. for(t = x, x = y, y = t, x[sa[0]] = 0, i = 1, p = 1 ; i < n ; ++ i)
  27. x[sa[i]] = CP(t, sa[i], sa[i-1], j)?p-1:p++;
  28. }
  29. }
  30.  
  31. void HT(int n) {
  32. int i, j, k = 0;
  33. for(i = 0 ; i <= n ; ++ i) rk[sa[i]] = i;
  34. for(i = 0 ; i < n ; ht[rk[i ++]] = k)
  35. for(k?--k:0, j = sa[rk[i]-1]; w[i+k]==w[j+k] ; ++ k);
  36. return;
  37. }
  38.  
  39. int main() {
  40. freopen("patterns.in", "r", stdin);
  41. freopen("patterns.out", "w", stdout);
  42. int n, k, mx = 0;
  43. scanf("%d%d", &n, &k);
  44. for(int i = 0 ; i < n ; ++ i) {
  45. scanf("%d", &w[i]);
  46. if(mx<w[i]) mx = w[i];
  47. }
  48. HZ(w, sa, n+1, mx);
  49. HT(n);
  50. for(int i = 2 ; i < k ; ++ i) {
  51. while(hd<tl&&ht[lie[tl-1]]>ht[i]) -- tl;
  52. lie[tl ++] = i;
  53. }
  54. for(int i = k ; i <= n ; ++ i) {
  55. while(hd<tl&&lie[hd]<=i-k+1) ++ hd;
  56. while(hd<tl&&ht[lie[tl-1]]>ht[i]) -- tl;
  57. lie[tl ++] = i;
  58. if(ans<ht[lie[hd]]) ans = ht[lie[hd]];
  59. }
  60. printf("%d", ans);
  61. return 0;
  62. }