bzoj1110 [POI2007]对称轴osi manacher(kmp)

73 篇文章 0 订阅
10 篇文章 0 订阅

题意:给一个多边形,求他的对称轴数量。
谁能独立切下这题我跪下了。。
正解是kmp(manacher),就是把多边形字符化以后找有多少个回文串。。延长一倍以后既可以用反串kmp也可以直接manacher。。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int N=1e6+5;
int n,m; 
struct node
{
    int x,y;
}e[N];
int s[N],a[N];
inline int dis(int i,int j)
{
    return(e[i].x-e[j].x)*(e[i].x-e[j].x)+(e[i].y-e[j].y)*(e[i].y-e[j].y);
}
inline int cross(int a,int b,int c)
{
    return (e[b].x-e[a].x)*(e[c].y-e[a].y)-
    (e[c].x-e[a].x)*(e[b].y-e[a].y);
}
int main()
{
    int cas;
    scanf("%d",&cas);
    while (cas--)
    {
        scanf("%d",&n);
        fo(i,0,n-1)
        scanf("%d%d",&e[i].x,&e[i].y);
        fo(i,0,n-1)s[i<<1|1]=dis(i,(i+1)%n);
        fo(i,0,n-1)s[i<<1]=cross(i,(i-1+n)%n,(i+1)%n);
        int all=n<<1;
        fo(i,0,n-1)s[i+all]=s[i];
        int tot=all<<1;
        int ans=0,mx=0,id=0;
        memset(a,0,sizeof(a));
        fo(i,0,tot-1)
        {
            if (mx>i)a[i]=min(mx-i,a[2*id-i]);
            else a[i]=1;
            while (i-a[i]>=0&&i+a[i]<=tot&&s[i-a[i]]==s[i+a[i]])a[i]++;
            if (i+a[i]>mx)mx=i+a[i],id=i;
            if (a[i]>=n+1)ans++;
        }
        printf("%d\n",ans);
    }
    return 0;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值