NCPC 2014 H Clock Pictures(KMP)

题意:给出两个时钟上相对于某个固定位置的n个点的距离,判断两钟是否是同一时刻。

思路:排序后,找相邻之差,然后kmp匹配。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
int a[maxn],b[maxn];
int next_[maxn],n;
int dvalue1[2*maxn],dvalue2[maxn];
void pre_KMP()
{
    int i = 0;
    int j = next_[0] = -1;
    while(i < n)
    {
        while(j != -1 && dvalue2[i]!= dvalue2[j])
            j = next_[j];
        next_[++i] = ++j;
    }
}
int KMP()
{
    int i,j;
    i = j = 0;
    while(i < 2 * n)
    {
        while(j != -1 && dvalue1[i]!= dvalue2[j])
            j = next_[j];
        i++;
        j++;
        if(j >= n)
            return 1;
    }
    return 0;
}
int main()
{
    cin>>n;
    for(int i = 0; i < n; i++)
    {
        cin>>a[i];
    }
    for(int i = 0 ; i < n; i++)
    {
        cin>>b[i];
    }
    sort(a,a+n);
    sort(b,b+n);
    for(int i = 0; i < n-1; i++)
    {
        dvalue1[i] = dvalue1[n+i] = a[i+1] - a[i];
        dvalue2[i] = b[i+1] - b[i];
    }
    dvalue1[n-1] = dvalue1[2*n-1] = 360000- a[n-1] + a[0]; //度数最小的先加一周再做差才是两边点的度数只差
    dvalue2[n-1] = 360000 - b[n-1] + b[0];
    pre_KMP();
    if(KMP())
    {
        cout<<"possible"<<endl;
    }
    else
    {
        cout<<"impossible"<<endl;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章