題意:給出兩個時鐘上相對於某個固定位置的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;
}
}