题目:https://loj.ac/problem/2303

想到合并的时候可以只考虑接口附近的50个,但不太会分析复杂度,而且没有清楚地想到用哈希值对应个数。

看了题解才会……

一直想用 splay ,其实链表就可以。用 unsigned long long 就不会被卡。

不能用 map ,而是要用哈希表把字符串的哈希值映射到个数上。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll unsigned long long
using namespace std;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
const int mod=; const ll bs=;
const int N=2e5+,m2=1e6+,M=1e7+,K=; int n,m,vl[N],pr[N],nt[N],ct[M];
ll tp[M],p[K],bin[K];char s[M];//ll!!! not int
namespace H{
int hd[m2+],xnt,nxt[M];ll to[M];
int get(ll x)
{
int h=x%m2;
for(int i=hd[h];i;i=nxt[i])
if(to[i]==x)return i;
to[++xnt]=x;nxt[xnt]=hd[h];hd[h]=xnt;
return xnt;
}
}
void mrg(int x,int y,bool fx)
{
if(!fx){nt[x]=y; pr[y]=x;} else{y=nt[x]; nt[x]=pr[y]=;}
int tot=,cr=y;
while(cr)
{
tot++; tp[tot]=(tp[tot-]*bs+vl[cr]);
cr=nt[cr]; if(tot==)break;
}
int tt=; cr=x;
while(cr)
{
tt++; p[tt]=(p[tt-]+vl[cr]*bin[tt-]);
cr=pr[cr]; if(tt==)break;
}
for(int i=tt;i;i--)
for(int j=;j<=tot;j++)
{
if(i+j>)break;
ll h=p[i]*bin[j]+tp[j];
int tp=H::get(h);
if(fx)ct[tp]--;
else ct[tp]++;
}
}
int main()
{
n=rdn();m=rdn();
bin[]=;
for(int i=;i<=;i++)
{
bin[i]=bin[i-]*bs;
}
for(int i=;i<=n;i++)
{
vl[i]=rdn();
int k=H::get(vl[i]); ct[k]++;
}
for(int i=,op,x,y;i<=m;i++)
{
op=rdn();
if(op==){ x=rdn();y=rdn();mrg(x,y,);}
if(op==){ x=rdn();mrg(x,,);}
if(op==)
{
scanf("%s",s+); x=rdn(); y=strlen(s+);
for(int j=;j<=y;j++)
tp[j]=(tp[j-]*bs+(s[j]-''));
int ans=;
for(int j=x;j<=y;j++)
{
ll h=tp[j]-tp[j-x]*bin[x];
int tp=H::get(h);
ans=(long long)ans*ct[H::get(h)]%mod;
}
printf("%d\n",ans);
}
}
return ;
}

LOJ 2303 「NOI2017」蚯蚓排队——链表+哈希表的更多相关文章

  1. LOJ#2303. 「NOI2017」蚯蚓排队

    $n \leq 200000$的$1 \leq a_i \leq 6$的蚯蚓,有三种操作:让一只队头蚯蚓接在一只队尾蚯蚓后面:让一队蚯蚓从某个蚯蚓后面断成两队:问:给个字符串,问他的..算了你们直接看 ...

  2. LOJ2303 「NOI2017」蚯蚓排队

    「NOI2017」蚯蚓排队 题目描述 蚯蚓幼儿园有$n$只蚯蚓.幼儿园园长神刀手为了管理方便,时常让这些蚯蚓们列队表演. 所有蚯蚓用从$1$到$n$的连续正整数编号.每只蚯蚓的长度可以用一个正整数表示 ...

  3. 「NOI2017」蚯蚓排队 解题报告

    「NOI2017」蚯蚓排队 这题真的草 你考虑\(k\)这么小,每次合并两个串,增加的有用串的数量是\(O(k^2)\)的,暴力加入这些串,求一下这些串的Hash值,塞到Hash表里面去 这里采用类似 ...

  4. 【BZOJ4943】【NOI2017】蚯蚓排队(哈希)

    [BZOJ4943][NOI2017]蚯蚓排队(哈希) 题面 BZOJ 洛谷 UOJ 题解 记得去年看网络同步赛的时候是一脸懵逼的. 昨天看到\(zsy\)做了,今天就看了看.. 这不是\(Hash\ ...

  5. loj #2305. 「NOI2017」游戏

    #2305. 「NOI2017」游戏 题目描述 小 L 计划进行 nnn 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 AAA.BBB. ...

  6. loj#2305. 「NOI2017」游戏 2-sat

    链接 https://loj.ac/problem/2305 https://www.luogu.org/problemnew/show/P3825 思路 3-sat神马的就不要想了,NP问题 除去x ...

  7. LOJ 2304 「NOI2017」泳池——思路+DP+常系数线性齐次递推

    题目:https://loj.ac/problem/2304 看了各种题解…… \( dp[i][j] \) 表示有 i 列.第 j 行及以下默认合法,第 j+1 行至少有一个非法格子的概率,满足最大 ...

  8. LOJ 2302 「NOI2017」整数——压位线段树

    题目:https://loj.ac/problem/2302 压30位,a最多落在两个位置上,拆成两次操作. 该位置加了 a 之后,如果要进位或者借位,查询一下连续一段 0 / 1 ,修改掉,再在含有 ...

  9. *LOJ#2306. 「NOI2017」蔬菜

    $n \leq 100000$种蔬菜,每个蔬菜有:一单位价格:卖第一单位时额外价格:总量:每天腐烂量.每天能卖$m \leq 10$单位蔬菜,多次询问:前$k \leq 100000$天最多收入多少. ...

随机推荐

  1. 004-URL编码转换函数:escape()、encodeURI()、encodeURIComponent()

    一.概述 函数出现时间:                     escape()                                javascript 1.0             ...

  2. 用 Flask 来写个轻博客 (37) — 在 Github 上为第一阶段的版本打 Tag

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 第一阶段结语 打 Tag 前文列表 用 Flask 来写个轻博客 (1 ...

  3. jmeter之JDBC请求

    jmeter不仅可以测试http请求,也可以执行JDBC请求的测试.本次以mysql为例,介绍JDBC请求如何完成发送 目录 1.环境配置 2.数据库连接配置 3.添加一个JDBC请求 1.环境配置 ...

  4. ASP.NET MVC Filter过滤机制(过滤器、拦截器)

    https://blog.csdn.net/knqiufan/article/details/82413885 本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/ ...

  5. Git015--标签管理

    Git--标签管理 本文来自于:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/ ...

  6. Node.js实战6:定时器,使用timer延迟执行。

    setTimeout 在nodejs中,通过setTimeout函数可以达到延迟执行的效果,这个函数也常被称为定时器. 一个简单的例子: console.log( (new Date()).getSe ...

  7. 使用pycharm调试远程服务器上的程序

    一.PyCharm实现远程调试代码 1. 和远程服务器建立连接,tools àDeploymentàConfiguration 2. 点击“+”号,按照远程服务器信息配置信息 点击“Advanced ...

  8. linux mysql修改数据表结构语法

    MySQL修改表的语法=========================增加列[add 列名]=========================①alter table 表名 add 列名 列类型 列 ...

  9. pthread_cond_timedwait

    该函数用于在同时等待条件变量时提供超时功能,不过该函数的超时时间是一个绝对时间.默认使用系统时间,这意味这,若修改系统时间,那么超时就不准确,有可能提前返回,也可能要几年才返回.这在某些需求下会导致b ...

  10. php中的花括号使用详解

    1.简单句法规则(用花括号界定变量名,适用于PHP所有版本,是php系统设定):    $a = 'flower';    echo "She received some $as" ...