题意:给出两个时钟上相对于某个固定位置的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;
}
}