2016-05-21因为BZOJ上“ 数据文件太过巨大,仅提供前三组数据测试.”所以我考场上写的60分的点分治交上去也A了。

我的这个点分治的时间复杂度是$O(Tnmlogn)$的,听题解时没听懂$O(Tnlogn)$的标算,还有听说标算要用到字符串哈希,然而我并不会,所以先留个坑,贴上自己的60分代码,满分做法等我学会哈希之后再做

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N = 1000003;
  6. void read(int &k) {
  7. k = 0; int fh = 1; char c = getchar();
  8. for(; c < '0' || c > '9'; c = getchar())
  9. if (c == '-') fh = -1;
  10. for(; c >= '0' && c <= '9'; c = getchar())
  11. k = (k << 1) + (k << 3) + c - '0';
  12. k = k * fh;
  13. }
  14.  
  15. struct node {int nxt, to;} E[N << 1];
  16. int n, m, cnt, point[N], root, qu[N], fa[N], t[N], sz[N];
  17. char c[N], mu[N];
  18. bool vis[N], bo[N];
  19.  
  20. void ins(int x, int y) {E[++cnt].nxt = point[x]; E[cnt].to = y; point[x] = cnt;}
  21. void findrt(int x) {
  22. int p = 0, u, q = 1; qu[1] = x; fa[x] = 0;
  23. while (p != q) {
  24. u = qu[++p]; bo[u] = 1; sz[u] = 1;
  25. for(int tmp = point[u]; tmp; tmp = E[tmp].nxt)
  26. if (!vis[E[tmp].to] && E[tmp].to != fa[u])
  27. qu[++q] = E[tmp].to, fa[E[tmp].to] = u;
  28. }
  29. for(int i = q; i >= 1; --i) {
  30. u = qu[i];
  31. if (bo[u] && sz[u] * 2 > q) {root = u; return;}
  32. sz[fa[u]] += sz[u];
  33. if (sz[u] * 2 > q) bo[fa[u]] = 0;
  34. }
  35. }
  36. int leftnow, rightnow, leftsum, rightsum, ret;
  37. void BFSleft(int x) {
  38. int p = 0, u, q = 1, tt; qu[1] = x;
  39. while (p != q) {
  40. u = qu[++p];
  41. for(int tmp = point[u]; tmp; tmp = E[tmp].nxt)
  42. if (!vis[E[tmp].to] && E[tmp].to != fa[u] && c[E[tmp].to] == mu[tt = ((t[u] - 1 + m) % m)])
  43. fa[E[tmp].to] = u, t[E[tmp].to] = tt, qu[++q] = E[tmp].to;
  44. }
  45. for(int i = 1; i <= q; ++i)
  46. if (t[qu[i]] == 0) ++leftnow;
  47. }
  48. void BFSright(int x) {
  49. int p = 0, u, q = 1, tt; qu[1] = x;
  50. while (p != q) {
  51. u = qu[++p];
  52. for(int tmp = point[u]; tmp; tmp = E[tmp].nxt)
  53. if (!vis[E[tmp].to] && E[tmp].to != fa[u] && c[E[tmp].to] == mu[tt = ((t[u] + 1) % m)])
  54. fa[E[tmp].to] = u, t[E[tmp].to] = tt, qu[++q] = E[tmp].to;
  55. }
  56. for(int i = 1; i <= q; ++i)
  57. if (t[qu[i]] == (m - 1)) ++rightnow;
  58. }
  59. void work(int x) {
  60. vis[x] = 1;
  61. int tt;
  62. for(int to = 0; to < m; ++to)
  63. if (c[x] == mu[to]) {
  64. leftsum = 0; rightsum = 0; if (to == 0) leftsum = 1; if (to == m - 1) rightsum = 1;
  65. for(int i = point[x]; i; i = E[i].nxt)
  66. if (!vis[E[i].to]) {
  67. leftnow = 0;
  68. if (c[E[i].to] == mu[tt = (to - 1 + m) % m])
  69. fa[E[i].to] = x, t[E[i].to] = tt, BFSleft(E[i].to);
  70. rightnow = 0;
  71. if (c[E[i].to] == mu[tt = (to + 1) % m])
  72. fa[E[i].to] = x, t[E[i].to] = tt, BFSright(E[i].to);
  73. ret += leftsum * rightnow;
  74. ret += rightsum * leftnow;
  75. leftsum += leftnow; rightsum += rightnow;
  76. leftnow = 0; rightnow = 0;
  77. }
  78. }
  79. for(int i = point[x]; i; i = E[i].nxt)
  80. if (!vis[E[i].to]) {findrt(E[i].to); work(root);}
  81. }
  82. int main() {
  83. freopen("pattern.in", "r", stdin);
  84. freopen("pattern.out", "w", stdout);
  85. int T, u, v;
  86. read(T);
  87. while (T--) {
  88. read(n); read(m);
  89. scanf("%s", c + 1);
  90. cnt = 0; memset(point, 0, sizeof(point)); memset(vis, 0, sizeof(vis));
  91. for(int i = 1; i < n; ++i) {read(u); read(v); ins(u, v); ins(v, u);}
  92. scanf("%s", mu);
  93. ret = 0;
  94. findrt(1);
  95. work(root);
  96. printf("%d\n", ret);
  97. }
  98. return 0;
  99. }

【BZOJ 4598】【SDOI 2016 Round2 Day1 T3】模式字符串的更多相关文章

  1. 【BZOJ 4515】【SDOI 2016 Round1 Day1 T3】游戏

    考场上写了lct,可惜当时对标记永久化的理解并不是十分深刻,导致调一个错误的程序调了4h+,最后这道题爆0了QwQ 现在写了树链剖分,用标记永久化的线段树维护轻重链,对于$s\rightarrow l ...

  2. 【BZOJ 4518】【SDOI 2016 Round1 Day2 T3】征途

    比较明显的斜率优化DP,省选时因为时间太紧张和斜率DP写得不熟等原因只写了60分的暴力DP,其实当时完全可以对拍来检验标算的正确,但是我当时too naive- 很快打完了,调了将近一晚上QAQ,因为 ...

  3. [BZOJ 4516] [SDOI 2016] 生成魔咒

    Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例 ...

  4. SDOI 2016 Round1 Day1

    储能表 /* 引自zyz大佬的数学思想 */ #include<cstdio> #include<iostream> using namespace std; typedef ...

  5. 【NOIP2016】Day1 T3 换教室(期望DP)

    题目背景 NOIP2016 提高组 Day1 T3 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n 节课程安排在 n 个时间段上. ...

  6. [BZOJ 1879][SDOI 2009]Bill的挑战 题解(状压DP)

    [BZOJ 1879][SDOI 2009]Bill的挑战 Description Solution 1.考虑状压的方式. 方案1:如果我们把每一个字符串压起来,用一个布尔数组表示与每一个字母的匹配关 ...

  7. JOISC 2017 Day1 T3 烟花棒

    JOISC 2017 Day1 T3 烟花棒 题意: ​ 数轴上有\(N\)人在放烟花,一开始只有第\(K\)个人的烟花是点燃的,烟花燃烧的时间为\(T\)秒,求让所有人的烟花都可以点燃的速度的最小值 ...

  8. [LOJ 2083][UOJ 219][BZOJ 4650][NOI 2016]优秀的拆分

    [LOJ 2083][UOJ 219][BZOJ 4650][NOI 2016]优秀的拆分 题意 给定一个字符串 \(S\), 求有多少种将 \(S\) 的子串拆分为形如 AABB 的拆分方案 \(| ...

  9. NOIP2017 Day1 T3 逛公园

    NOIP2017 Day1 T3 更好的阅读体验 题目描述 策策同学特别喜欢逛公园.公园可以看成一张\(N\)个点\(M\)条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,\(N\)号点 ...

随机推荐

  1. android camera setMeteringArea详解

    摘要: 本文为作者原创,未经允许不得转载:原文由作者发表在博客园:http://www.cnblogs.com/panxiaochun/p/5802814.html setMeteringArea() ...

  2. 从WinCE到Linux

    到新的公司已经快两个月了,新的工作主要方向是Linux驱动移植和Android系统定制.由于项目还在立项的阶段,并没有分配具体的工作任务,所以找来一个Linux的开发板先玩一玩.它采用的处理器NUC9 ...

  3. HDU4003Find Metal Mineral[树形DP 分组背包]

    Find Metal Mineral Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Other ...

  4. stl学习(一)优先队列

    优先队列priority queue 头文件 #include<queue> 优先队列,也就是原来我们学过的堆,按照自己定义的优先级出队时.默认情况下底层是以Vector实现的heap. ...

  5. 各种AJAX方法的使用比较

    转:http://www.cnblogs.com/fish-li/archive/2013/01/13/2858599.html#_label6 AJAX技术经过这么多年的发展,出现了一些框架或类库用 ...

  6. oracle round 函数,replace()函数

    (1)如何使用 Oracle Round 函数 (四舍五入)描述 : 传回一个数值,该数值是按照指定的小数位元数进行四舍五入运算的结果.SELECT ROUND( number, [ decimal_ ...

  7. 判断一个变量的类型Object.prototype.toString.call

    var num = 1;alert(Object.prototype.toString.call(num)); // [object Number]var str = 'hudidit.com';al ...

  8. 利用统计学知识为android应用的启动时间做数据分析

    [声明:如需转载本文,请注明来源] 一.数据说明 启动时间用同一台设备,同一个包进行启动时间的测试,其中三组样本数据(每组100份对比数据)如下: 设备pro-5-1 base_list_1 = [0 ...

  9. Maven 常用命令, 备忘

    Maven在现在的Java项目中有非常重要的地位, Maven已经不是Ant这样仅仅用于构建, 首先, 它是一个构建工具, 把源代码编译并打包成可发布应用的构件工具其次, 它是一个依赖管理工具, 集中 ...

  10. ASP.NET 中执行 URL 重写

    具体实现步骤(其中的一种实现方法): 一.下载相关的DLL(ActionlessForm.dll和UrlRewriter.dll) http://download.csdn.net/detail/yi ...