zoukankan      html  css  js  c++  java
  • bzoj4698 / P2463 [SDOI2008]Sandy的卡片

    P2463 [SDOI2008]Sandy的卡片

    直接二分长度暴力匹配.......

    跑的还挺快

    (正解是后缀数组的样子)

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 void read(int &x){
     6     char c=getchar();x=0;
     7     while(c<'0'||c>'9')c=getchar();
     8     while('0'<=c&&c<='9')x=x*10+(c^48),c=getchar();
     9 }
    10 #define N 1002
    11 int n,a[N][N],b[N];
    12 bool ask2(int st,int x){
    13     bool p;
    14     for(int i=2;i<=n;++i){
    15         p=0;
    16         for(int j=1;!p&&j<=b[i]-x+1;++j){
    17             int v=a[1][st]-a[i][j];p=1;
    18             for(int k=1;p&&k<x;++k)
    19                 if(a[1][st+k]!=a[i][j+k]+v)p=0;
    20         }if(!p) return 0;
    21     }return 1;
    22 }
    23 bool ask1(int x){
    24     if(x==1) return 1;
    25     for(int i=1;i<=b[1]-x+1;++i)
    26         if(ask2(i,x)) return 1;
    27     return 0;
    28 }
    29 int main(){
    30     read(n); int k=1;
    31     for(int i=1;i<=n;++i){
    32         read(b[i]);
    33         if(b[k]>b[i]) k=i;
    34         for(int j=1;j<=b[i];++j) read(a[i][j]);
    35     }if(k!=1) swap(a[1],a[k]),swap(b[1],b[k]);
    36     int l=1,r=b[1],mid;
    37     while(l+1<r){
    38         mid=l+((r-l)>>1);
    39         if(ask1(mid)) l=mid;
    40         else r=mid-1;
    41     }printf("%d",ask1(r)?r:l);
    42     return 0;
    43 }
    View Code

    丧心病狂压行版

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define re return
     4 int n,a[1002][1002],b[1002],k;
     5 bool ask2(int s,int x){
     6     for(int i=2,j,k;i<=n;++i){bool p=0;
     7         for(j=1;!p&&j<=b[i]-x+1;++j){p=1;
     8             for(k=1;p&&k<x;++k)
     9                 if(a[1][s+k]!=a[i][j+k]+a[1][s]-a[i][j])p=0;
    10         }if(!p) re 0;}re 1;}
    11 bool ask1(int x){for(int i=1;i<=b[1]-x+1;++i)if(ask2(i,x))re 1;re 0;}
    12 int main(){cin>>n;k=1;
    13     for(int i=1,j;i<=n;++i){cin>>b[i];if(b[k]>b[i])k=i;
    14         for(j=1;j<=b[i];++j)cin>>a[i][j];
    15     }if(k!=1)swap(a[1],a[k]),swap(b[1],b[k]);
    16     int l=1,r=b[1],mid;
    17     while(l+1<r)mid=l+r>>1,ask1(mid)?l=mid:r=mid-1;
    18     cout<<(ask1(r)?r:l);}
    View Code
  • 相关阅读:
    Dybala我错了%Dybala
    2019.7.22考试反思
    2019.7.19考试反思
    2019.7.18 考试反思
    数论总结之 乘法逆元
    数论总结之 卢卡斯定理
    游记 Day2
    【BSGS】Discrete Logging
    【卡特兰数】树屋阶梯
    【链接】 一篇很好的有关prufer序列的博文
  • 原文地址:https://www.cnblogs.com/kafuuchino/p/10228462.html
Copyright © 2011-2022 走看看