• ncpc2014-Clock Pictures


    Clock Pictures

    kmp

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=2*1e5+10;
    int s[maxn],t[maxn];
    int s1[2*maxn],t1[maxn];
    int Next[maxn];
    int n;
    void get_Next()
    {//Next数组保存了以i结尾的字符串的最长公共前缀和后缀的起始坐标
        int i,j;
        Next[0] = j = -1;
        i = 0;
        while(i < n)
        {
            while(j!=-1&&t1[j]!=t1[i])//自身和自身进行匹配
                j = Next[j];
            Next[++i] = ++j;
        }
    }
    int kmp()
    {
        int i,j;
        i = j = 0;
        int l1=2*n;
        int l2=n;
        while(i < l1&&j<l2)
        {
           if(j==-1||s1[i]==t1[j])
            {
                i++;j++;
            }
            else
                j=Next[j];
    
        }
        if(j == l2)
            return 1;//存在完全匹配状况
        return 0;//不存在匹配情况
    }
    
    int main()
    {
        //freopen("in.txt", "r", stdin);
        ios::sync_with_stdio(false);
        cin >> n;
        for (int i = 0; i < n; i++)
            cin >> s[i];
        for(int i=0; i<n; i++)
            cin>>t[i];
        sort(s, s + n);
        sort(t, t + n);
        for (int i = 1; i < n; i++)
        {
            s1[i - 1] = s[i] - s[i - 1];
    
        }
         for (int i = 1; i < n; i++)
        {
    
            t1[i - 1] = t[i] - t[i - 1];
        }
        s1[n - 1] = 360000 + s[0] - s[n - 1];
        t1[n - 1] = 360000 + t[0] - t[n - 1];
        for (int i = 0; i < n; i++) s1[i + n] = s1[i];
        get_Next();
        bool flag =kmp();
        if (flag)
            cout << "possible" << endl;
        else
            cout << "impossible" << endl;
        return 0;
    }
    View Code
  • 相关阅读:
    二叉树的非递归遍历
    关于vc变量定义顺序猜测
    单点登录详解(token简述)(七)
    session及cookie详解(七)
    dubbo(八)
    Zookeeper简介(九)
    拦截器与过滤器的区别(九)
    cookie详解(八)
    kafka可视化工具(二)
    Windows环境安装kafka(一)
  • 原文地址:https://www.cnblogs.com/kuroko-ghh/p/9556721.html
Copyright © 2020-2023  润新知