【HDOJ 5371】 Hotaru’s problem

Manacher算法+穷举/set

Manacher算法一好文:http://blog.csdn.net/yzl_rex/article/details/7908259

套一个Manacher算出回文半径数组p之后 有两种方法

穷举法:

枚举-1的点(依据题意仅仅必为偶数回文) 找在该点回文半径内与其相隔最远 而且回文半径等于他俩距离(即两点为中心的回文串同样) 的点 记录找到时的距离 不断枚举找最大值即为最大回文串长 串长/2*3即为答案

set法:

记录-1的位置 依据每一个-1相应的回文半径排序 从大到小枚举增加set 每增加一个位置i后 查找大于i-p[i]的第一个数(lower_bound) 和小于等于i+p[i]的第一个数(–upper_bound) 该位置与这两个位置的距离即为各自组成的回文串长度的二分之中的一个 找到最大的*3即为答案

代码例如以下:

  1. //穷举
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. using namespace std;
  6. int nwm[200002];
  7. int p[200002];
  8. void Manacher(int n)//马拉车模板
  9. {
  10. nwm[0] = -2;
  11. int i;
  12. for(i = 0; i < n; i++)
  13. {
  14. nwm[i*2+1] = -1;
  15. scanf("%d",&nwm[i*2+2]);
  16. }
  17. nwm[n*2+1] = -1;
  18. nwm[n*2+2] = -3;
  19. int maxid = 0,id;
  20. n = n*2+2;
  21. for(i = 2; i < n; ++i)
  22. {
  23. if(maxid > i) p[i] = min(p[id*2-i],maxid-i);
  24. else p[i] = 1;
  25. while(nwm[i+p[i]] == nwm[i-p[i]]) p[i]++;
  26. if(p[i]+i > maxid)
  27. {
  28. maxid = p[i]+i;
  29. id = i;
  30. }
  31. }
  32. }
  33. int main()
  34. {
  35. int t,n,z = 0,i,mm,x;
  36. scanf("%d",&t);
  37. while(t--)
  38. {
  39. mm = 0;
  40. scanf("%d",&n);
  41. Manacher(n);
  42. for(i = 3; i +4< n*2+2; i+=2)//枚举-1
  43. {
  44. if(p[i]-1 > mm)
  45. {
  46. x = p[i]-1;//记录-1为中心的最大回文串长
  47. while(x > mm && p[i+x] < x)//枚举找满足题意的第二回文中心
  48. x--;
  49. mm = max(mm,x);
  50. }
  51. }
  52. printf("Case #%d: %d\n",++z,mm/2*3);
  53. }
  54. return 0;
  55. }
  1. //set方法
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <set>
  6. #include <algorithm>
  7. using namespace std;
  8. int nwm[200002];
  9. int p[200002];
  10. int id[200002],tp;
  11. set <int> s;
  12. void Manacher(int n)
  13. {
  14. nwm[0] = -2;
  15. int i;
  16. for(i = 0; i < n; i++)
  17. {
  18. nwm[i*2+1] = -1;
  19. id[tp++] = i*2+1;//将-1位置记录
  20. scanf("%d",&nwm[i*2+2]);
  21. }
  22. nwm[n*2+1] = -1;
  23. nwm[n*2+2] = -3;
  24. int maxid = 0,id;
  25. n = n*2+2;
  26. for(i = 2; i < n; ++i)
  27. {
  28. if(maxid > i) p[i] = min(p[id*2-i],maxid-i);
  29. else p[i] = 1;
  30. while(nwm[i+p[i]] == nwm[i-p[i]]) p[i]++;
  31. if(p[i]+i > maxid)
  32. {
  33. maxid = p[i]+i;
  34. id = i;
  35. }
  36. }
  37. }
  38. bool cmp(int a,int b)//按-1相应回文距离由大到小排序
  39. {
  40. return p[a] > p[b];
  41. }
  42. int main()
  43. {
  44. int t,n,z = 0,i,mm,x,l,r;
  45. scanf("%d",&t);
  46. while(t--)
  47. {
  48. s.clear();
  49. tp = 0;
  50. mm = 0;
  51. scanf("%d",&n);
  52. Manacher(n);
  53. sort(id,id+tp,cmp);
  54. for(i = 0; i < tp; ++i)//回文距离从大到小枚举位置
  55. {
  56. s.insert(id[i]);
  57. l = *s.lower_bound(id[i]-p[id[i]]);//找左边第一个>=id[i]-p[id[i]]的位置
  58. r = *(--s.upper_bound(id[i]+p[id[i]]));//找右边第一个<=id[i]+p[id[i]]的位置
  59. mm = max(mm,max(id[i]-l,r-id[i]));
  60. }
  61. printf("Case #%d: %d\n",++z,mm/2*3);
  62. }
  63. return 0;
  64. }

【HDOJ 5371】 Hotaru&#39;s problem的更多相关文章

  1. 【HDOJ 5654】 xiaoxin and his watermelon candy(离线+树状数组)

    pid=5654">[HDOJ 5654] xiaoxin and his watermelon candy(离线+树状数组) xiaoxin and his watermelon c ...

  2. 【HDOJ 2255】奔小康赚大钱(KM算法)

    [HDOJ 2255]奔小康赚大钱(KM算法) 奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  3. 【HDOJ 5379】 Mahjong tree

    [HDOJ 5379] Mahjong tree 往一颗树上标号 要求同一父亲节点的节点们标号连续 同一子树的节点们标号连续 问一共同拥有几种标法 画了一画 发现标号有二叉树的感觉 初始标号1~n 根 ...

  4. 【HDOJ 2089】不要62

    [HDOJ 2089]不要62 第一个数位dp的题 做的老困难了...只是好歹是做出来了 迈出了第一步.. 对大牛来说这样的题都是小case ps:新上一个记忆化方法 一些绕弯的题里用dfs好想些 代 ...

  5. 【HDOJ 5399】Too Simple

    pid=5399">[HDOJ 5399]Too Simple 函数映射问题 给出m函数 里面有0~m个函数未知(-1) 问要求最后1~n分别相应仍映射1~n 有几种函数写法(已给定的 ...

  6. 【HDOJ 3652】B-number

    [HDOJ 3652]B-number 给一整数n 找<=n的整数中能被13整除且含有13的 数位dp 记忆化! . 一入记忆化深似海. ..再也不想用递推了...发现真的非常好想 仅仅要保证满 ...

  7. 【HDOJ 5419】 Victor and Toys (排列组合)

    [HDOJ 5419] Victor and Toys n个玩具 m个区间 每一个玩具有一个beauty值 问任选三个区间 三区间的MINleft~MAXright的和的期望值 预处理一个数组 存放每 ...

  8. 【HDOJ 1009】 CRB and String

    [HDOJ 1009] CRB and String 每组两个串s t 仅仅由小写字母组成 问从s能不能变成t 改变的操作为选一个字符 在后面加上一个与所选字符不同的字符 这样的操作能够做无数次 问能 ...

  9. 【HDOJ 2063】过山车

    [HDOJ 2063]过山车 二分图最大匹配模板题 1女对n男 问匹配最大对数 代码例如以下: #include <iostream> #include <cstdlib> # ...

随机推荐

  1. java EE技术体系——CLF平台API开发注意事项(3)——API安全访问控制

    前言:提离职了,嗯,这么多年了,真到了提离职的时候,心情真的很复杂.好吧,离职阶段需要把一些项目中的情况说明白讲清楚,这篇博客就简单说一下在平台中对API所做的安全处理(后面讲网关还要说,这里主要讲代 ...

  2. 找不到css 路径问题

    今天进入一个网页的时候,一直报找不到css的错误,但是我的路径原来是正确的 后来找网络控制台,发现路径上多了一个listCommodity,是我controller里面的跳到这个页面的路径 然后我在& ...

  3. iOS学习笔记44-Swift(四)枚举和结构体

    一.Swift的枚举 枚举是一系相关联的值定义的一个公共的组类型,同时能够让你在编程的时候在类型安全的情况下去使用这些值.Swift中的枚举比OC中的枚举强大得多, 因为Swift中的枚举是一等类型, ...

  4. eclipse Java EE安装和web项目的创建

    一.根据http://www.itnose.net/detail/6139800.html基本安装成功二.根据http://www.cnblogs.com/freebsd-pann/archive/2 ...

  5. 校赛——1096Is The Same?(KMP或字符串的最小、大表示法)

    1096: Is The Same? Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 26  Solved: 8[Submit][Status][Web B ...

  6. jquery工具方法总结

    $.extend 对象合并,支持深拷贝 $.each 相当于array.each或object.each,可以遍历数组和对象 $.grep 相当于array.filter $.map 相当于array ...

  7. 眉目传情之匠心独运的kfifo【转】

    转自:http://blog.csdn.net/chen19870707/article/details/39899743 权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 一 ...

  8. HDU 1394:Minimum Inversion Number(树状数组,线段树)[水]

    题意:有0~n-1这n个数,以一定的排列.这个排列可以循环,就是可以把第一个拿到最后,然后形成新的排列.问这些排列中的逆序对最小值. 思路: 最后的循环,拿走一个之后,新的逆序对数 newsum = ...

  9. AC日记——联合权值 洛谷 P1351

    题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...

  10. FMDB使用Cached Statement功能

    FMDB使用Cached Statement功能   在FMDB中,Cached Statement功能是一种提高SQLite数据库访问的技术.在SQLite中,所有的SQL语句都会被编译,形成预处理 ...