Clock Pictures CSU - 1581

#include<cstdio>
#include<iostream>
#include<cstring>
#include<memory>
#include<algorithm>
using namespace std;
#define mod 360000
int a[200005],b[200005];
int c[200005],d[200005*2];
int ne[200005];
int sum;
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=n;i++)
		cin>>b[i];
	sort(a+1,a+1+n);
	sort(b+1,b+1+n);
	for(int i=1;i<=n-1;i++)
		c[i]=a[i+1]-a[i];
	c[n]=a[1]-a[n]+mod;
	for(int i=0;i<=n-1;i++)
		d[i]=b[i+1]-b[i];
	b[n]=b[1]-b[n]+mod;
	for(int i=n+1;i<=2*n;i++)
		d[i]=d[i-n];
	//模板串 
	for(int i = 2, j = 0; i <= n; i ++ ) 
	{
        while (j && c[i] != c[j + 1])   
			j = ne[j];
        if (c[i] == c[j + 1])    
			j ++ ;
        ne[i] = j;
    }
    int f1=0;
    for (int i = 1, j = 0; i <= 2*n; i ++ ) {
        while (j && d[i] != c[j + 1])    //当j没有退回起点,并且当前的s[i]不能和下一个j的位置匹配
            j = ne[j];//移动,保证之前的相等  直到匹配位置,或者j已经到开头了
        if (d[i] == c[j + 1]) //如果已经匹配了
            j ++ ;  //j往下移动
        if (j == n) {//说明匹配成果
            printf("possible\n");
            break;
        }
    }
    if(f1==0)
    	printf("impossible\n");
} 
posted @ 2020-02-29 16:25  晴屿  阅读(182)  评论(0)    收藏  举报