LOJ 2303 「NOI2017」蚯蚓排队——链表+哈希表
题目: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」蚯蚓排队——链表+哈希表的更多相关文章
- LOJ#2303. 「NOI2017」蚯蚓排队
$n \leq 200000$的$1 \leq a_i \leq 6$的蚯蚓,有三种操作:让一只队头蚯蚓接在一只队尾蚯蚓后面:让一队蚯蚓从某个蚯蚓后面断成两队:问:给个字符串,问他的..算了你们直接看 ...
- LOJ2303 「NOI2017」蚯蚓排队
「NOI2017」蚯蚓排队 题目描述 蚯蚓幼儿园有$n$只蚯蚓.幼儿园园长神刀手为了管理方便,时常让这些蚯蚓们列队表演. 所有蚯蚓用从$1$到$n$的连续正整数编号.每只蚯蚓的长度可以用一个正整数表示 ...
- 「NOI2017」蚯蚓排队 解题报告
「NOI2017」蚯蚓排队 这题真的草 你考虑\(k\)这么小,每次合并两个串,增加的有用串的数量是\(O(k^2)\)的,暴力加入这些串,求一下这些串的Hash值,塞到Hash表里面去 这里采用类似 ...
- 【BZOJ4943】【NOI2017】蚯蚓排队(哈希)
[BZOJ4943][NOI2017]蚯蚓排队(哈希) 题面 BZOJ 洛谷 UOJ 题解 记得去年看网络同步赛的时候是一脸懵逼的. 昨天看到\(zsy\)做了,今天就看了看.. 这不是\(Hash\ ...
- loj #2305. 「NOI2017」游戏
#2305. 「NOI2017」游戏 题目描述 小 L 计划进行 nnn 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 AAA.BBB. ...
- loj#2305. 「NOI2017」游戏 2-sat
链接 https://loj.ac/problem/2305 https://www.luogu.org/problemnew/show/P3825 思路 3-sat神马的就不要想了,NP问题 除去x ...
- LOJ 2304 「NOI2017」泳池——思路+DP+常系数线性齐次递推
题目:https://loj.ac/problem/2304 看了各种题解…… \( dp[i][j] \) 表示有 i 列.第 j 行及以下默认合法,第 j+1 行至少有一个非法格子的概率,满足最大 ...
- LOJ 2302 「NOI2017」整数——压位线段树
题目:https://loj.ac/problem/2302 压30位,a最多落在两个位置上,拆成两次操作. 该位置加了 a 之后,如果要进位或者借位,查询一下连续一段 0 / 1 ,修改掉,再在含有 ...
- *LOJ#2306. 「NOI2017」蔬菜
$n \leq 100000$种蔬菜,每个蔬菜有:一单位价格:卖第一单位时额外价格:总量:每天腐烂量.每天能卖$m \leq 10$单位蔬菜,多次询问:前$k \leq 100000$天最多收入多少. ...
随机推荐
- 搭建maven本地仓库
1. 需先配置java环境. 2. 下载nexus. https://www.sonatype.com/download-nexus-repo-oss?submissionGuid=a015a3db- ...
- 网页导出excel
package site.action.ecom.backend.wechat.exportExcel; import java.lang.annotation.Documented;import j ...
- 常见ORM框架及JDBC操作工具类
在Java 程序里面去连接数据库,最原始的办法是使用JDBC 的API.我们先来回顾一下使用JDBC 的方式,我们是怎么操作数据库的. // 注册JDBC 驱动 Class.forName(" ...
- MySQL安装教程并使用springboot2和Mybatis测试
目录 MySQL是什么 MySQL安装 开始使用一下MySQL 用spring boot2+Mybatis试试MySQL 创建数据库和表 拉通spring boot2+mybatis MySQL是什么 ...
- Dp状态设计与方程总结
1.不完全状态记录<1>青蛙过河问题<2>利用区间dp 2.背包类问题<1> 0-1背包,经典问题<2>无限背包,经典问题<3>判定性背包问 ...
- 状压BFS
题意:1个机器人找几个垃圾,求出最短路径. 状压BFS,这道题不能用普通BFS二维vis标记数组去标记走过的路径,因为这题是可以往回走的,而且你也不能只记录垃圾的数量就可以了,因为它有可能重复走同一 ...
- Spark链接hive时 “HikariCP” 问题
IDE本地调试和spark-shell调试报错: Caused by: org.datanucleus.exceptions.NucleusUserException: The connection ...
- Android手机、电视(盒子) 打开ADB调试 一览表
手机.电视(盒子) 打开ADB调试 一览表 一.手机打开ADB调试方法 序号 名称 描述 方式 1 华为手机 EMUI 1.设置 ->关于手机-> 版本号 点击(4~5次)2.返回设置 - ...
- JavaScript中函数带与不带括号的区别
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 重命名sql数据库
use master select spid from master.dbo.sysprocesses where dbid=db_id('TW') 查看连接,杀死线程 use master kill ...