BZOJ1100 : [POI2007]对称轴osi
2015-06-30 12:16
381 查看
将多边形转化为如下的环:
1到2的边,角2,2到3的边,角3,...,n-1到n的边,角n,n到1的边,角1
然后枚举对称轴,如果i是对称轴,那么[i-n,i+n]是一个回文串
用Manacher算法实现即可。
时间复杂度$O(n)$。
1到2的边,角2,2到3的边,角3,...,n-1到n的边,角n,n到1的边,角1
然后枚举对称轴,如果i是对称轴,那么[i-n,i+n]是一个回文串
用Manacher算法实现即可。
时间复杂度$O(n)$。
#include<cstdio> #define N 100010 typedef long long ll; int T,n,i,r,p,f[N<<2],ans; struct P{ int x,y; P(){x=y=0;} P(int _x,int _y){x=_x,y=_y;} inline P operator-(P b){return P(x-b.x,y-b.y);} }a ; inline ll sqr(ll x){return x*x;} inline ll dis(P a,P b){return sqr(a.x-b.x)+sqr(a.y-b.y);} inline ll cross(P a,P b){return (ll)a.x*b.y-(ll)a.y*b.x;} struct Q{ ll x;int y; Q(){x=y=0;} Q(ll _x,int _y){x=_x,y=_y;} inline bool operator==(Q b){return x==b.x&&y==b.y;} }b[N<<2]; inline int min(int a,int b){return a<b?a:b;} inline void read(int&a){ char c;bool f=0;a=0; while(!((((c=getchar())>='0')&&(c<='9'))||(c=='-'))); if(c!='-')a=c-'0';else f=1; while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0'; if(f)a=-a; } int main(){ for(read(T);T--;printf("%d\n",ans>>1)){ read(n); for(i=1;i<=n;i++)read(a[i].x),read(a[i].y); a[n+1]=a[1],a[n+2]=a[2]; for(i=1;i<=n;i++){ b[i*2-1]=Q(dis(a[i],a[i+1]),1); b[i*2]=Q(cross(a[i+1]-a[i],a[i+1]-a[i+2]),2); } for(i=1;i<=n*2;i++)b[i+n*2]=b[i]; b[n*4+1]=Q(0,3); for(r=p=0,i=1;i<=n*4;i++){ for(f[i]=r>i?min(r-i,f[p*2-i]):1;b[i-f[i]]==b[i+f[i]];f[i]++); if(i+f[i]>r)r=i+f[i],p=i; } for(ans=0,i=n+1;i<=n*3;i++)if(f[i]>n)ans++; } return 0; }
相关文章推荐
- zookeeper原理
- DateTime.Now与DateTime.Today的区别
- 详解Python中的序列化与反序列化的使用
- ThinkPhp 中Action控制器中动态改变自动完成规则(使用setProperty)
- 黑马程序员-OC语言-封装的实现步骤(听课笔记)
- JS实现简单的图书馆享元模式实例
- boost在自己主动确定数据类型(BOOST_TYPEOF和BOOST_AUTO)使用
- 【Spring学习笔记-MVC-15】Spring MVC之异常处理
- javascrip cookie
- 在linux 下安装sublime text 2
- iOS自定义字体
- 写一个每秒接收 100 万数据包的程序究竟有多难?
- AndroidAnnotations在Android Studio中的配置
- 避免碌碌无为的感觉
- 循环赛日程表问题
- 可拖拽listview基本使用技巧(DragSortListView)
- Android Support库百分比布局
- WPF的DatePicker--日期选择器
- 【leetcode c++】67 Add Binary
- JS建造者模式基本用法实例分析