首页 > 其他分享 >Stack Exterminable Arrays

Stack Exterminable Arrays

时间:2023-10-24 18:55:25浏览次数:33  
标签:hsh ch Arrays top Exterminable int now Stack define

prologue

CSPS2023 T2 原题,什么成分我就不多说了。(考场上没写出来的菜鱼,想到栈了然后算法假了,寄

analysis

(虽然这样不对,但是我还是想撇一下我的错解)

错解

我们开一个栈,每一个元素进来看和栈顶元素一样不一样,如果不一样,就入栈,否则就 \(ans + cnt\),\(cnt\) 表示我们的栈有多少次是空的。

正解

我们同样是开一个栈,但是我们这个栈用来存储两个位置 \((now, nw)\) 表示的是这个到目前为止的状态,这个状态为了防止重复,所以我们对这个状态进行一个哈希,为了减小冲突,我们还可以对这两个采取不同的哈希方式。每次进行累加这个状态就好了。

code time

// author : Carp

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define fom(i, a) for(int i=a; i; -- i)
#define foa(i, a, b) for(int i=a; i < b; ++ i)
#define fos(i, a, b) for(int i=a; i <= b; ++ i)
#define fop(i, a, b) for(int i=a; i >= b; -- i)
#define ws putchar(' ')
#define wl putchar('\n')

template <class T> inline void waw(T x)
{
    if(x > 9) waw(x / 10);
    putchar(x % 10 ^ 48);
}

template <class T> inline void ww(T x)
{
    if(x < 0) x = ~x + 1, putchar('-');
    waw(x);
}

template <class T> inline void read(T &res)
{
    char ch = getchar(); bool f = 0; res = 0;
    for(; !isdigit(ch); ch = getchar()) f |= ch == '-';
    for(; isdigit(ch); ch = getchar()) res = (res << 1) + (res << 3) + (ch ^ 48);
    res = f ? ~res + 1 : res;
}

const int N = 3e5 + 10;

const ll  P = 998244353;

typedef pair<ll, ll> pll;

int n, a[N], stk[N];

ll hsh[N];

map<pll, ll> sta;

mt19937 rnd(15617);

inline void solve()
{
    read(n); 
    
    fos(i, 1, n) read(a[i]);

    fos(i, 1, n + 5) hsh[i] = rnd();

    int top = 0, now = 0, nw = 0;
    
    ll ans = 0;

    sta.clear();

    sta[{0, 0}] = 1;

    fos(i, 1, n)
    {
        if(stk[top] == a[i] && top) -- top, now += (hsh[top + 1] * a[i]) % P, nw ^= (hsh[top + 1] * a[i]) % P;
        else stk[++ top] = a[i], now -= (hsh[top] * a[i]) % P, nw ^= (hsh[top] * a[i]) % P;

        ans += sta[{now, nw}];
        sta[{now, nw}] ++ ;
    }

    ww(ans), wl;
}

int main() { ll T; read(T); while(T -- ) solve(); return 0; }

标签:hsh,ch,Arrays,top,Exterminable,int,now,Stack,define
From: https://www.cnblogs.com/carp-oier/p/17785524.html

相关文章

  • 每天5分钟复习OpenStack(六)CPU虚拟化<2>
    OpenStack是一个IAAS(基础设施即服务)因此免不了会与硬件打交道。下面我介绍下与CPU强关联的一些知识点。1什么是超配2CPU的个数是怎么统计的3vCPU的隔离、绑定1、超配在kvm虚拟化的环境中,一个vCPU本质上是一个kvm的一个线程,如果一台虚拟机有4个vCPU,对应的就是4个线程......
  • go-ethereum-master/core/vm/stack.go 源码阅读
    //Copyright2014Thego-ethereumAuthors//Thisfileispartofthego-ethereumlibrary.////Thego-ethereumlibraryisfreesoftware:youcanredistributeitand/ormodify//itunderthetermsoftheGNULesserGeneralPublicLicenseaspublishedby......
  • B. Friendly Arrays
    B.FriendlyArrays依据异或特性,如果n为偶数,单调递减:与b[i]|越多越小反之递增点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+10;#defineLLlonglonginta[N],b[N];voidsolve(){ intn,m; cin>>n>>m; if(n%2==0){ int......
  • openstack开放镜像权限
    一、 将镜像文件cirros-0.4.0-x86_64-disk.img 上传到/root目录下获取环境变量:. /etc/keystone/admin-openrc.sh二、 将cirros-0.4.0-x86_64-disk.img上传到云平台中创建一个镜像cirros4:openstackimagecreate--disk-formatqcow2--container-formatbare--filecirros......
  • Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法
    Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,此处测试代码如下,这里使用add方法:1publicclassmain{2publicstaticvoidmain(String[]args){3int[]num={1,2,3};4Listlist=Arrays.asList(num);5list.add(4);......
  • 无涯教程-Arduino - Multi-Dimensional Arrays函数
    具有二维的数组(即下标)通常表示由以行和列排列的信息组成的值表。intb[2][2]={{1,2},{3,4}};这些值按大括号按行分组,因此,1和2分别初始化b[0][0]和b[0][1],而3和4分别初始化b[1][0]和b[1][1],如果给定行的初始化程序不足,则将该行的其余元素初始化为0。因此......
  • Docker 安装bookstack
    Docker安装bookstack(环境centos)docker安装自行百度yuminstall-ydockerMYSQL安装#拉取镜像dockerpullmysql#创建数据存放位置mkdir-p/var/own/datadirmkdir-p/var/own/conf#在/var/own/conf新建my.cnf并填写内容vimy.cnf#创建mysql容器dockerrun--na......
  • Arrays.asList() 和 Collections.singletonList()
    Collections.singletonList()  创建不可变List,只包含单个元素,List容量始终为1;  Arrays.asList()  快速创建List,但创建的列表是不可变的,不可调用add方法;......
  • Atcoder Beginner Contest 324 G Generate Arrays 题解-Treap
    为了更好的阅读体验,请点击这里题目链接套上平衡树板子就能做的很快的题,然后因为是指针存树,因此交换只需要把序列大小较小的挨个拿出来插到相应的地方即可。复杂度\(O(N\log^2N)\)。但是一定要记住不可以直接使用std::swap交换包含带有指针的类的实例(如代码中的Treap类)!......
  • vue项目运行内存不足 JS stacktrace
     因为node配置的环境变量默认是4096,如果vue项目过大,可能就会导致保存的时候,项目死掉。解决办法:1、我的电脑右键属性 2、搜索环境变量,点击编辑系统环境变量 3、点击环境变量4、更改默认值......