思路:好脑洞啊。。。 把边和角转化为字符串,然后用反串跑kmp。。。

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define fi first
  4. #define se second
  5. #define mk make_pair
  6. #define pii pair<int, int>
  7.  
  8. using namespace std;
  9.  
  10. const int N = 1e5 + ;
  11. const int M = 1e6 + ;
  12. const int inf = 0x3f3f3f3f;
  13. const LL INF = 0x3f3f3f3f3f3f3f3f;
  14. const int mod = 1e9 +;
  15.  
  16. int n, m;
  17. LL a[N << ], b[N << ];
  18. int nx[N << ];
  19. struct Point {
  20. LL x, y;
  21. Point(LL x = , LL y = ) {
  22. this->x = x;
  23. this->y = y;
  24. }
  25.  
  26. Point operator - (const Point &rhs) const {
  27. return Point(x - rhs.x, y - rhs.y);
  28. }
  29. } p[N];
  30.  
  31. typedef Point Vector;
  32. LL dis(const Point &a, const Point &b) {
  33. return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
  34. }
  35.  
  36. LL cross(Vector a, Vector b) {
  37. return a.x * b.y - a.y * b.x;
  38. }
  39.  
  40. void getNext() {
  41. int k = ;
  42. for(int i = ; i < m; i++) {
  43. while(k > && b[k] != b[i]) k = nx[k - ];
  44. if(b[k] == b[i]) k++;
  45. nx[i] = k;
  46. }
  47. }
  48.  
  49. int kmp() {
  50. int k = , ans = ;
  51. for(int i = ; i < n; i++) {
  52. while(k > && b[k] != a[i]) k = nx[k - ];
  53. if(b[k] == a[i]) k++;
  54. if(k == m) {
  55. ans++;
  56. k = nx[k - ];
  57. }
  58. }
  59. return ans;
  60. }
  61.  
  62. int main(){
  63. int T; scanf("%d", &T);
  64. while(T--) {
  65. scanf("%d", &n);
  66. for(int i = ; i < n; i++) {
  67. scanf("%lld%lld", &p[i].x, &p[i].y);
  68. }
  69.  
  70. for(int i = ; i < n; i++) {
  71. Vector v1 = p[(i + ) % n] - p[i];
  72. Vector v2 = p[(i - + n) % n] - p[i];
  73. a[i << ] = cross(v1, v2);
  74. }
  75.  
  76. for(int i = ; i < n; i++) {
  77. a[i << | ] = dis(p[i], p[(i + ) % n]);
  78. }
  79.  
  80. for(int i = * n; i < * n; i++) {
  81. a[i] = a[i - * n];
  82. }
  83.  
  84. m = * n;
  85. n = * n;
  86.  
  87. for(int i = ; i < m; i++) {
  88. b[i] = a[i];
  89. }
  90. reverse(b, b + m);
  91.  
  92. getNext();
  93. printf("%d\n", kmp());
  94. }
  95. return ;
  96. }
  97.  
  98. /*
  99. */

bzoj 1100的更多相关文章

  1. BZOJ 1100: [POI2007]对称轴osi

    1100: [POI2007]对称轴osi Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 630  Solved: 243[Submit][Statu ...

  2. bzoj 1100 [POI2007]对称轴osi manacher

    [POI2007]对称轴osi Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 771  Solved: 307[Submit][Status][Dis ...

  3. bzoj 1100: [POI2007]对称轴osi 思维

    特别神的一道题. 有一句话要反复揣摩:题中给的所有点构成一个多边形!! 而且读入还是按照多边形的轮廓读进来的!!! 我们知道,如果对称轴确定的话判定条件是对应角相等且对应边相等. 所以把相邻边夹角和边 ...

  4. BZOJ 1100 &&luogu 3454(计算几何+KMP)

    题面 给定一个多边形,求对称轴数量. 分析 初看这似乎是一道计算几何的题目,但是如果暴力枚举对称轴,再去判断对称轴两边的边和角是否相等,时间复杂度为\(O(n^2)\),显然会TLE 问题转换 顺时针 ...

  5. [原博客] POI系列(3)

    正规.严谨.精妙. -POI BZOJ 1131 : [POI2008]Sta 树形dp吧,让求找一个点使以这个点深度和最小.首先可以随便整出来一棵树,对于每个节点记录down[i]以i为根下面的点的 ...

  6. 【BZOJ】1100: [POI2007]对称轴osi

    题意 给一个\(n(1 \le n \le 100000)\)个点不自交的多边形,求对称轴数目. 分析 将多边形表示成长度和角的形式(用有向面积来表示角也行),然后匹配. 题解 匹配可以用kmp或ma ...

  7. 【BZOJ】【2084】【POI2010】Antisymmetry

    Manacher算法 啊……Manacher修改一下就好啦~蛮水的…… Manacher原本是找首尾相同的子串,即回文串,我们这里是要找对应位置不同的“反回文串”(反对称?233) 长度为奇数的肯定不 ...

  8. BZOJ 2440 [中山市选2011]完全平方数 (二分 + 莫比乌斯函数)

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 4805  Solved: 2325[Submit][Sta ...

  9. BZOJ 3235: [Ahoi2013]好方的蛇

    BZOJ 3235: [Ahoi2013]好方的蛇 标签(空格分隔): OI-BZOJ OI-DP OI-容斥原理 Time Limit: 10 Sec Memory Limit: 64 MB Des ...

随机推荐

  1. PHP_INT_SIZE

    PHP_INT_SIZE:表示整数integer值的字长 PHP_INT_MAX:表示整数integer值的最大值 注: 输出下32位中PHP_INT_SIZE:4,PHP_INT_MAX:21474 ...

  2. tp 中 where条件,字段和字段的大小比较

    $map = array( , 'start_time' => array('lt',$now), 'end_time' => array('gt',$now), , '_string' ...

  3. Kubernetes - Deploy Guestbook example on Kubernetes

    This scenario explains how to launch a simple, multi-tier web application using Kubernetes and Docke ...

  4. LightOJ 1017 - Brush (III) 记忆化搜索+细节

    http://www.lightoj.com/volume_showproblem.php?problem=1017 题意:给出刷子的宽和最多横扫次数,问被扫除最多的点是多少个. 思路:状态设计DP[ ...

  5. PHP与Ajax

    如何用PHP接收JSON格式数据 1.一般来说,我们直接用$_POST $_REQUEST $_GET这样的超全局变量接收就好了 <?php $obj_temp=$_POST['data']; ...

  6. Hibernate + mysql 查询伪劣时:= 出现 Space is not allowed after parameter prefix ':' MySQL异常

    需求: 要求查询一个站点在地市和省的排名信息出来. 效果图: 代码实现: 注释的部分是起初采用的hibernate 查询,但无论怎么写都会报 space is not allowed after pa ...

  7. (知识扩展)R运用领域一览表

    • Applications and Case Studies - Lessons and Experiences • Big Data Analytics • Biomedical and Heal ...

  8. LintCode 397: Longest Increasing Continuous Subsequence

    LintCode 397: Longest Increasing Continuous Subsequence 题目描述 给定一个整数数组(下标从0到n - 1,n表示整个数组的规模),请找出该数组中 ...

  9. js关闭当前页面跳转新页面

    页面代码: <p class="info"><span style="font-weight: bold">所属项目:</span ...

  10. IP判断 (字符串处理)

    关于IP合法性判断的题目,每个oj上的约束条件不尽相同,我就根据自己做过的题目吧所有的约束条件汇总到一块,到时候做题时只需要把多余的越是条件删掉即可 题目描述: 对于IP我们总会有一定的规定,合法的I ...