NOI2017蚯蚓排队
发现 k<=50 ,在插入和删除时最多会影响不超过 k2 个串,用链表实现插入和删除,然后只需用哈希表维护每个长度不超过k的串的出现次数,哈希的话可以先用比较大的范围的值处理冲突,再映射到1e8的桶里统计。
考虑复杂度。
首先在删除时由于保证了 c<=1000 所以这部分复杂度是O(ck2)的。
插入时,如果插入操作很慢只有可能是连接两个长度不小于k的串,而长度不小于k的串最多有n/k个,所以这部分复杂度是O(nk)的
所以总复杂度是O(nk+ck2+|s|)。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<cmath>
#include<map>
using namespace std;
inline void read(int &re)
{
char ch=getchar();int g=1;
while(ch<'0'||ch>'9') {if(ch=='-')g=-1;ch=getchar();}
re=0;
while(ch<='9'&&ch>='0') re=(re<<1)+(re<<3)+(ch^48),ch=getchar();
re*=g;
}
typedef long long ll;
typedef double db;
typedef unsigned long long ul;
const ul bas=7u;
const ll mod=998244353;
const ul mod2=99999971u;
const int N=200050;
int head[N],tail[N],cnt=0,nex[20050000],fir[100000000];
int num[20050000];
ul hax[20050000];
char leng[N]; inline ul qpow(ul a,int n)
{
ul ans=1;
for(;n;n>>=1,a=a*a) if(n&1) ans=ans*a;
return ans;
} inline void insert(ul x)
{
ul m=x%mod2;
int u=fir[m];
if(!u)
{
fir[m]=++cnt; hax[cnt]=x;
num[cnt]++; return ;
}
if(hax[u]==x) {num[u]++;return ;}
while(nex[u])
{
u=nex[u];
if(hax[u]==x) {num[u]++; return ;}
}
cnt++;
nex[u]=cnt;
hax[cnt]=x; num[cnt]++;
} inline void del(ul x)
{
ul m=x%mod2;
int u=fir[m];
while(u)
{
if(hax[u]==x) {num[u]--;return ;}
u=nex[u];
}
} inline int query(ul x)
{
ul m=x%mod2;
int u=fir[m];
while(u)
{
if(hax[u]==x) return num[u];
u=nex[u];
}
return 0;
}
char a[10000050];
int n,m; int main()
{
#ifndef ONLINE_JUDGE
freopen("queue.in","r",stdin);freopen("queue.out","w",stdout);
#endif
int i,j,opt,x,y,k;
read(n);read(m);
for(i=1;i<=n;++i)
{
read(opt),leng[i]=opt+48;
ul has=leng[i]-48u;
insert(has);
}
while(m--)
{
read(opt);
if(opt==1)
{
read(x);read(y);//--x y--
tail[x]=y;head[y]=x;
int u=x,v;
for(i=1;i<=50-2&&head[u];++i) u=head[u];
for(;u!=y;u=tail[u])
{
bool can=0;
v=u;
ul has=0;
has=leng[u]-48u;
for(i=1;i<50;++i)
{
v=tail[v];
if(!v) break;
has=has*bas+leng[v]-48u;
if(v==y||can)
{
can=1;
insert(has);
}
}
}
}
else if(opt==2) // --x || y--
{
read(x);
int u=x,v;
y=tail[x];
for(i=1;i<=50-2&&head[u];++i) u=head[u];
for(;u!=y;u=tail[u])
{
bool can=0;
v=u;
ul has=leng[u]-48u;
for(i=1;i<50;++i)
{
v=tail[v];
if(!v) break;
has=has*bas+leng[v]-48u;
if(v==y||can)
{
can=1;
del(has);
}
}
}
head[y]=0;tail[x]=0;
}
else
{
ll ans=1;
scanf("%s",a);read(k);
int len=strlen(a); ul has=0,powbas=qpow(bas,k-1);
for(i=0;i<k;++i) has=has*bas+a[i]-48u;
ans=ans*(ll)query(has);
for(i=1;i<=len-k;++i)
{
has=(has-(a[i-1]-48u)*powbas)*bas+a[i+k-1]-48u;
ans=ans*(ll)query(has)%mod;
}
printf("%lld\n",ans);
}
}
return 0;
}
NOI2017蚯蚓排队的更多相关文章
- BZOJ4943 NOI2017蚯蚓排队(哈希+链表)
能看懂题就能想到正解.维护所有长度不超过k的数字串的哈希值即可,用链表维护一下蚯蚓间连接情况.由于这样的数字串至多只有nk个,计算哈希值的总复杂度为O(nk),而分裂的复杂度为O(ck^2),询问复杂 ...
- [NOI2017]蚯蚓排队 hash
题面:洛谷 题解: 我们暴力维护当前所有队伍内的所有子串(长度k = 1 ~ 50)的出现次数. 把每个子串都用一个hash值来表示,每次改变队伍形态都用双向链表维护,并暴力更新出现次数. 现在考虑复 ...
- BZOJ4943 & 洛谷3823 & UOJ315:[NOI2017]蚯蚓排队——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4943 http://uoj.ac/problem/315 https://www.luogu.or ...
- 洛谷3823 [NOI2017] 蚯蚓排队 【哈希】
题目分析: 从$\sum|S|$入手.共考虑$\sum|S|$个$f(t)$.所以我们要一个对于每个$f(t)$在$O(1)$求解的算法.不难想到是哈希. 然后考虑分裂和合并操作.一次合并操作要考虑合 ...
- 【uoj#315/bzoj4943】[NOI2017]蚯蚓排队 Hash
题目描述 给出 $n$ 个字符,初始每个字符单独成字符串.支持 $m$ 次操作,每次为一下三种之一: $1\ i\ j$ :将以 $i$ 结尾的串和以 $j$ 开头的串连到一起. $2\ i$ :将 ...
- bzoj4943 [Noi2017]蚯蚓排队
题面:http://www.lydsy.com/JudgeOnline/upload/Noi2017D1.pdf 正解:字符串$hash$. 我在考场上写了个$map$的$hash$被卡成$40$分, ...
- P3823_[NOI2017]蚯蚓排队 哈希+脑子
之前就写过一遍,今天却写挂了,查了半天发现是数组名写错啦$qwq$ 观察到$K$很小,所以使得我们可以哈希(怎么什么都能哈希$qwq$).我们把长度小于等于$50$的子串扔到哈希表里,并统计出现次数, ...
- 洛谷P3832 [NOI2017]蚯蚓排队 【链表 + 字符串hash】
题目链接 洛谷P3832 题解 字符串哈希然后丢到hash表里边查询即可 因为\(k \le 50\),1.2操作就暴力维护一下 经复杂度分析会发现直接这样暴力维护是对的 一开始自然溢出WA了,还以为 ...
- [NOI2017]蚯蚓排队
嘟嘟嘟 现在看来这道题还不是特别难. 别一看到字符串就想SAM 看到\(k\)很小,所以我们可以搞一个单次修改复杂度跟\(k\)有关的算法. 能想到,每一次断开或链接,最多只会影响\(k ^ 2\)个 ...
- [NOI2017]蚯蚓排队(链表+hash)
这题看题面感觉挺玄学的,但其实会挂链式hash就能暴力切了,就是纸老虎,考察选手的语文水平.不过三年没写挂链hash也应该写一下了…… 首先模数设成自然溢出ull,然后挂链时的模数取2^24.然后就可 ...
随机推荐
- Informatica旗下PowerCenter的元数据库解析
因客户需求,最近重拾Informatica下的PowerCenter产品,主要研究数据血缘关系.从PowerCenter本身来看,它是一个功能非常强大,速率非常高效的一款付费的ETL工具,可以满足各种 ...
- ceph 005 赋权补充 rbd块映射
我的ceph版本 [root@serverc ~]# ceph -v ceph version 16.2.0-117.el8cp (0e34bb74700060ebfaa22d99b7d2cdc037 ...
- MySQL源码分析之SQL函数执行
1.MySQL中执行一条SQL的总体流程 2.SQL函数执行过程 1.MySQL中执行一条SQL的总体流程 一条包含函数的SQL语句,在mysql中会经过: 客户端发送,服务器连接,语法解析,语句执行 ...
- 【java】学习路线1-类型转换、隐式转换、强制转换
/**文档注释,这里是一段文章一般放在类的外面*/public class HelloWorld{ //这个是注释的文本 public static void main(String[] ...
- KingbaseES R6 集群备库网卡down测试案例
数据库版本: test=# select version(); version ------------------------------------------------------------ ...
- 当web项目没有配置<welcome-file>index_1.jsp</welcome-file>默认标签启动tomcat后默认访问的页面是什么呢?
当web项目没有配置index_1.jsp默认标签启动tomcat后默认访问的页面是什么呢? 结果我启动后居然默认打开了index.jsp页面 为什么呢?为什么会访问我的.indexjsp页面呢?不是 ...
- iNeuOS工业互联网操作系统,面向4个领域颁发第一批技术认证资质
为了更好的紧密合作.利益多赢和共建生态.iNeuOS工业互联网操作系统面向:仪器仪表.双碳环保.核能科学与工程和钢铁冶金领域颁发第一批技术认证资质,一共21名同志在项目实施过程中表现突出,从iNeuO ...
- 璞华PLM为全场景产品生命周期管理赋能,助力产品主线的企业数字化转型
英文版的<产品生命周期管理(PLM)软件市场--增长.趋势.COVID-19影响和预测(2022 - 2027)>中对未来PLM市场概述的描述为:"产品生命周期管理(PLM)软件 ...
- Java 中HashMap 详解
本篇重点: 1.HashMap的存储结构 2.HashMap的put和get操作过程 3.HashMap的扩容 4.关于transient关键字 HashMap的存储结构 1. HashMap 总体是 ...
- 解决swiper组件autoplay报错问题
最近在自定义一个swiper 插件 发现引用之后不定时一直在报错 Uncaught TypeError: Cannot read properties of undefined (reading 'a ...