[BZOJ4943][NOI2017]蚯蚓
sol
用链表维护蚯蚓的相对顺序。
发现每次询问的\(k\le50\),所以在每次链表的合并与分离时,暴力找前后\(50\)个位置,然后\(O(k^2)\)地塞进\(Hash\ Table\)或者从\(Hash\ Table\)里面删除。
因为分离操作最多\(10^3\)次,所以合并操作最多\(n+999\)次,复杂度显然会是对的。
code
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int gi(){
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
#define ull unsigned long long
const int N = 2e5+5;
const int base = 20020415;
const int K = 51;
const int mod = 998244353;
int n,m,a[N],pre[N],nxt[N],f[N];ull pw[N],g[N];char s[N*50];
struct edge{ull v;int nxt,w;}E[N*99];int head[4194304],cnt;
void add(ull val,int op){
int u=val&4194303,e=head[u];
for (;e;e=E[e].nxt) if (E[e].v==val) {E[e].w+=op;return;}
E[e=++cnt]=(edge){val,head[u],op};head[u]=e;
}
int query(ull val){
int u=val&4194303,e=head[u];
for (;e;e=E[e].nxt) if (E[e].v==val) return E[e].w;
return 0;
}
void merge(){
int x=gi(),y=gi(),l=K,r=K-1;
for (int i=x;i&&l>1;i=pre[i]) f[--l]=a[i];
for (int i=y;i&&r<K*2;i=nxt[i]) f[++r]=a[i];
for (int i=1;i<=r;++i) g[i]=g[i-1]*base+f[i];
for (int i=l;i<K;++i)
for (int j=K;j<=min(r,i+49);++j)
add(g[j]-g[i-1]*pw[j-i+1],1);
nxt[x]=y;pre[y]=x;
}
void split(){
int x=gi(),y=nxt[x],l=K,r=K-1;
for (int i=x;i&&l>1;i=pre[i]) f[--l]=a[i];
for (int i=y;i&&r<K*2;i=nxt[i]) f[++r]=a[i];
for (int i=1;i<=r;++i) g[i]=g[i-1]*base+f[i];
for (int i=l;i<K;++i)
for (int j=K;j<=min(r,i+49);++j)
add(g[j]-g[i-1]*pw[j-i+1],-1);
nxt[x]=pre[y]=0;
}
int query(){
scanf("%s",s+1);int k=gi(),len=strlen(s+1);ull val=0;
for (int i=1;i<=k;++i) val=val*base+s[i];
int res=query(val);
for (int i=k+1;i<=len;++i){
val=val*base+s[i];
val-=s[i-k]*pw[k];
res=1ll*res*query(val)%mod;
}
return res;
}
int main(){
n=gi();m=gi();pw[0]=1;
for (int i=1;i<N;++i) pw[i]=pw[i-1]*base;
for (int i=1;i<=n;++i) add(a[i]=gi()+'0',1);
while (m--){
int op=gi();
if (op==1) merge();
else if (op==2) split();
else printf("%d\n",query());
}
return 0;
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· 一个基于 .NET 开源免费的异地组网和内网穿透工具
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单