1247 排排站 USACO(查分+hash)

/*
暴力查分 n*n
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#define maxn 100010
using namespace std;
int n,m,a[maxn],ans,p[maxn][31],r[31];
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
      scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++)
        if((1<<j-1)&a[i])p[i][j]=p[i-1][j]+1;
        else p[i][j]=p[i-1][j];
    for(int i=1;i<=n;i++)
      for(int j=i+1;j<=n;j++)
        {
          int falg=0;
          for(int k=1;k<=m;k++)
            r[k]=p[j][k]-p[i-1][k];
          for(int k=2;k<=m;k++)
            if(r[k]!=r[k-1]){falg=1;break;}
          if(!falg)ans=max(ans,j-i+1);
        }
    printf("%d\n",ans);
    return 0;
}
/*
还是差分
因为对于符合条件的序列
有 sj0 - si0 = sj1 - si1 =...= sjk-1 - sik-1
也就是说 如果存在i j 满足
  sj1 - sj0 == si1 - si0
  sj2 - sj0 == si2 - si0
       ......
  sjk-1 - sj0 == sik-1 - si0
我们定义c[i,j]=s[i,j]-s[i,0]
问题就转化成了 找隔得最远的ij 满足c[i] 和 c[j] 一样
这里用hash加速查找 给每个c[i] 搞一个hash值 放到hash表里
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#define maxn 100010
#define mod 999997
using namespace std;
int n,m,a[maxn],ans,p[maxn][35],c[maxn][35],has[maxn*10];
int Get_hash(int *a)
{
    int r=0;
    for(int i=0;i<m;i++)
        r=r%mod+a[i]<<2;
    if(r<0)r=-r;
    return r%mod;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
      scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
      for(int j=0;j<m;j++)
        if((1<<j)&a[i])p[i][j]=p[i-1][j]+1;
        else p[i][j]=p[i-1][j];
    for(int i=1;i<=n;i++)
      for(int j=0;j<m;j++)
        c[i][j]=p[i][j]-p[i][0];
    memset(has,-1,sizeof(has));
    has[0]=0;
    for(int i=1;i<=n;i++)
      {
          int k=Get_hash(c[i]);
          while(has[k]!=-1)
            {
                int falg=0;
                for(int j=0;j<m;j++)
                  if(c[has[k]][j]!=c[i][j])
                    {
                      falg=1;break;
                }
            if(!falg&&i-has[k]>ans)
              {
                  ans=i-has[k];break;
              }
            k++;
          }
        if(has[k]==-1)has[k]=i;
      }
    printf("%d\n",ans);
    return 0;
}
时间: 2024-08-10 22:35:29

1247 排排站 USACO(查分+hash)的相关文章

POJ1201 Intervals查分约束系统(最短路)

Description You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn. Write a program that: reads the number of intervals, their end points and integers c1, ..., cn from the standard input, computes the minimal size of a set Z of

三星代言造势 都教授排排站

台湾三星为年度品牌代言人金秀贤造势,今天在台邀请专属「都教授」,为民众介绍年度旗舰手机GALAXY S5,并举办「变身金秀贤PK大赛」,吸引现场「金秀贤们」精心打扮参赛. 韩剧「来自星星的你」在台风行,剧中饰演男主角「都教授」的韩国艺人金秀贤人气随之飙升,仔细观察,三星最新产品在「来自星星的你」剧中大量曝光,包括各角色人手一支的旗舰智能型手机GALAXY Note 3.和台湾日前刚上市的黄金曲面UHD TV等. 台湾三星今天在台北信义门市造势,活动一开始,10位三星专属「金秀贤」穿着合身黑西装.

POJ 2983 查分约束+SPFA

点击打开链接 题意:n个点,m个条件,P,a,b,c代表a到c的距离为c,V,a,b代表a到b的距离大于等于1,问所有条件是否可以成立 思路:看了查分约束来做这道题,还可以不是很难.若固定了位置则可以写出两个表达式a-b>=c&&b-a<=c:另一个则是a-b>=c,将条件全部转化为<=的,则可以变成查分约束,用SPFA判断有没有负环即可,但是这题要注意的是,图可能不是联通的,那么我们可以有两种方法,我们可以将全部的点都压进队列,还可以建立一个源点0,与每个点的距离

【查分约束】我爱你啊

某看了秒5而内心激动的人创作本题 我爱你啊 [题目描述]呐,贵树真的是一个很帅的男孩子呢,所以好多女孩都给他写至少一封了情书.那每个女孩给了贵树写了多少情书呢?我们不知道,但是我们知道一些女孩子写情书数量的关系,你的任务是推断出贵树最少受到了多少情书.[输入文件]输入的第一行为两个整数 N,K,表示一共 N 个女孩,知道 K 对关系接下来 K 行,每行三个整数 t,A,B如果 t=1,则表示 A 的情书和 B 的情书数量一样如果 t=2,则表示 A 的情书少于 B 的情书数量如果 t=3,则表示

HDU 3592 查分约束+判环

点击打开链接 题意:有N个人,然后X个关系和Y个关系,X关系代表的是这两个人的距离不能超过C,Y代表的是这两个人的距离要大于等于C,若不能满足所有的输出-1,若1与N的位置可以无穷大输出-2,否则输出两个人的最大距离 思路:就是查分约束的模型,X个关系按照位置建边,Y也是直接按位置建边就行了,就是两个初始方向不同,然后有负环的话就输出-1,距离无穷大输出-2,否则就是dis[N]的值就行了,自己讨论一下就可以出来了 #include <stdio.h> #include <string.

洛谷P1993 小 K 的农场(查分约束)

/* 加深一下对查分约束的理解 建图的时候为了保证所有点联通 虚拟一个点 它与所有点相连 权值为0 然后跑SPFA判负环 这题好像要写dfs的SPFA 要不超时 比较懒 改了改重复进队的条件~ */ #include<iostream> #include<cstdio> #include<cstring> #include<queue> #define maxn 40010 using namespace std; int n,m,num,head[maxn

BZOJ 3436 小K的农场 查分约束系统 SPFA判负环

题目大意:农场中有一些土地,上面会长一些作物,现在给出一些约束条件,问有没有这种可能. 思路:裸的查分约束系统判负环.记住要跑最长路. CODE: #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 100010 using namespace std; int points,asks;

POJ 3159 Candies(查分约束)

Description: During the kindergarten days, flymouse was the monitor of his class. Occasionally the head-teacher brought the kids of flymouse’s class a large bag of candies and had flymouse distribute them. All the kids loved candies very much and oft

HDU 3440 查分约束

点击打开链接 题意:给个n个不同的高度,一个人从最低点跳跃,每次可以跳到第一个比它高的位置,最后跳到最高点,然后每次最多可以跳的距离为D,而且在跳跃时可以在不改变给定顺序的情况下移动这些高度,使得最后起始点和终点的位置最远, 思路:自己想了一会,想的方向错了,我自己想的方法是将最小高度记为0,最大高度记为n-1,然后写查分约束方程,这了一会发现条件不足,没想法了,看了大牛们的解法发现原来以给定的顺序直接进行条件就可以了,而且好简单,因为我们不能调整给定的顺序,那么对于给定的顺序就可以有pos(i