10266번: 시계 사진들

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {
    public static int[] suffix;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        long n = Integer.parseInt(br.readLine());

        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        boolean[] P = new boolean[360000];
        for(int i = 0; i<n; i++){
            P[Integer.parseInt(st.nextToken())] = true;
        }

        suffix = new int[P.length];

        st = new StringTokenizer(br.readLine(), " ");
        boolean[] T = new boolean[360000*2];
        for(int i = 0; i<n; i++){
            int tmp = Integer.parseInt(st.nextToken());
            T[tmp] = true;
            T[tmp + 360000] = true;
        }

        getPI(P);
        if(KMP(T,P)) System.out.println("possible");
        else System.out.println("impossible");
    }

    public static void getPI(boolean[] P){
        int j = 0;
        for(int i = 1; i<P.length; i++){
            while(j>0 && P[i] != P[j]) j = suffix[j-1];
            if(P[i] == P[j]){
                suffix[i] = ++j;
            }
        }
    }

    public static boolean KMP(boolean[] T, boolean[] P){
        int j = 0;
        for(int i = 0; i<T.length-1; i++){
            while(j>0 && T[i] != P[j]){
                j = suffix[j-1];
            }
            if(T[i] == P[j]){
                if(j == P.length-1){
                    return true;
                }
                else ++j;
            }
        }
        return false;
    }
}