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;
    }
}

 

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