首页 > 其他分享 >蚯蚓排队

蚯蚓排队

时间:2023-07-21 21:57:22浏览次数:56  
标签:opt hash int 排队 fac include 蚯蚓

蚯蚓排队

思路上还是比较水的(然而扬言1h \(AC\) 的某人被许多小问题d了半天),操作一,二对于每个队伍都直接进行维护就好,关键是操作三(明明就是取个子串非不说人话)。

Analysis

  • 简化题意:给定一串字符(蚯蚓),三种操作:
    • \(opt=1\) 让第 \(i\) 与 \(j\) 个字符合并。
    • \(opt=2\) 让第 \(i\) 与 \(j\) 个字符分离。
    • \(opt=3\) 再给定一个字符串 \(s\) 与一个整数 \(k\),枚举每一个 \(s\) 的字串 \(\overline{s}\),将其与蚯蚓串的每个长度相同(即为 \(k\))的子串匹配,求每个 \(\overline{s}\) 可以匹配到的个数 \(d_i\),求 \(\Pi_{d_i}\mod 998244353\)。
  • 数据范围 \(k\leqslant 50\) 告诉我们直接维护暴力不同 \(k\) 值下的蚯蚓信息没有问题,对于某个操作显然只有待修位置的 \(k\) 长度附近的信息会受影响,提出来合并一下哈希值即可。
  • 平板电视还能被卡,建议自己重修 \(OI\)。
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
#define int unsigned long long
#define id(x) x-'0'
const int kk=1e7+100,N=2e5+5,base=131,mod=998244351;
using namespace std;
__gnu_pbds::cc_hash_table<int,int> cnt;
int n,m;
int fac[60],chs[N],nxt[N],pre[N];
char ch[kk];
inline void solve(int opt,int x,int y){
    nxt[x]=y,pre[y]=x;
    for(int len=2;len<=50;++len){
        int ne(0),pr(0);
        for(int i=x;i&&pr<=len-2;i=pre[i]) ++pr;
        for(int i=y;i&&pr+ne<len;i=nxt[i]) ++ne;
        if(pr+ne<len) break;pr=x;
        for(int i=1;i<len-1&&pre[pr];++i) pr=pre[pr];
        ne=pr;int hh(0);
        for(int i=1;i<=len;++i){
            hh=hh*base+chs[ne];
            ne=nxt[ne];
        }
        while(1){
            H.mdf(hh,opt==1?1:-1);
            if(!ne||pr==x) break;
            hh-=chs[pr]*fac[len-1];
            pr=nxt[pr];
            hh=hh*base+chs[ne];
            ne=nxt[ne];
        }
    }
    if(opt==2) nxt[x]=pre[y]=0;
}
inline void get_ans(char *s,int k){
    int ans=1,n(strlen(s+1));
    if(k==1){
        for(int i=1;i<=n;++i) ans=1ll*ans*cnt[id(s[i])]%mod;
        write(ans);return;
    }
    int hash(0);
    for(int i=1;i<=k;++i) hash=hash*base+id(s[i]);
    int l=1,r=k+1;
    while(1){
        ans=1ll*ans*H.qry(hash)%mod;
        if(r>n||!ans) break;
        hash-=(id(s[l++]))*fac[k-1];
        hash=hash*base+id(s[r++]);
    }
    write(ans);return;
}
signed main(){
    fac[0]=1;
    for(int i=1;i<=50;++i) fac[i]=fac[i-1]*base;
    n=read(),m=read();
    for(int i=1;i<=n;++i) chs[i]=read(),cnt[chs[i]]++;
    while(m--){
        int op(read()),a,b,k;
        switch(op){
            case 1:a=read(),b=read();solve(op,a,b);break;
            case 2:a=read();solve(op,a,nxt[a]);break;
            default:scanf("%s",ch+1);k=read();get_ans(ch,k);break;
        }
    }
    return 0;
}

标签:opt,hash,int,排队,fac,include,蚯蚓
From: https://www.cnblogs.com/shen666zxcmt/p/17572467.html

相关文章

  • 公元2023年7月20日20:10:排队接水,均分纸牌
    今日AC二道贪心的题目①P1223排队接水-洛谷|计算机科学教育新生态(luogu.com.cn)#include<bits/stdc++.h>usingnamespacestd;intn;doublettime;structp{//题目需输出编号,所以用一结构体intb,time;}t[1005];boolcmp(px,py){、、排序比较函数retu......
  • 双服务台串联排队系统——Python仿真
    串联排队系统是一种常见的排队系统结构,由多个单一排队系统按照特定的顺序连接而成。在串联排队系统中,一个排队系统的输出将成为下一个排队系统的输入,从而形成连续的流程。这种系统结构可以用于模拟和优化许多现实世界中的流程,如生产线、物流运输等。一、双服务台串联排队系统模......
  • P1223 排队接水
    题目描述有\(n\)个人在一个水龙头前排队接水,假如每个人接水的时间为\(T_i\),请编程找出这\(n\)个人排队的一种顺序,使得\(n\)个人的平均等待时间最小。证明如果要让所有人等待时间最短,那么就让打水速度快的人在前面\(Part\)\(1\)因为如果将等待时间较长的人往前排,......
  • 排队接水
    排队接水题目描述有\(n\)个人在一个水龙头前排队接水,假如每个人接水的时间为\(T_i\),请编程找出这\(n\)个人排队的一种顺序,使得\(n\)个人的平均等待时间最小。输入格式第一行为一个整数\(n\)。第二行\(n\)个整数,第\(i\)个整数\(T_i\)表示第\(i\)个人的等待时......
  • [C++/PTA] 办事大厅排队
    题目要求在郑州大学综合办事大厅,每天陆陆续续有很多人来排队办事。现在你能否写程序帮助老师时刻了解当前办理业务的情况。输入格式:第一行一个数字N,表示排队信息或者查询信息条目的数量。以下N行,每行的内容有以下3种情况(1)inname表示名字为name的人员新来到办事大厅,排在......
  • C/C++模拟银行排队叫号系统[2023-05-11]
    C/C++模拟银行排队叫号系统[2023-05-11]2、模拟银行排队叫号系统(难度等级A)[问题描述]模拟实现银行的排队叫号系统。[基本要求](1)假定银行上午9点开门,下午5点关门,期间每个小时的客流量不超过35人;(2)每个客户的基本信息包括:到达银行时间、业务需要办理的时长。这两项数据均......
  • 基于蒙特卡洛循环和排队理论的客户结账等待时间模拟优化matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:    当结账窗口数量为22时:到达顾客数:5863服务顾客数:5863损失顾客数:0平均服务时间:0.497495平均队长:11.661919平均等待时长:0.000105顾客不能马上得到服务的概率:0.000020 当结账窗口数量为23时:到达顾客数:5396服务顾客......
  • HDU1873 看病要排队
    E- 看病要排队TimeLimit:1000MS     MemoryLimit:32768KB     64bitIOFormat:%I64d&%I64uDescription看病要排队这个是地球人都知道的常识。不过经过细心的0068的观察,他发现了医院里排队还是有讲究的。0068所去的医院有三个医生(汗,这么......
  • 23-4-14--链表--银行排队问题之单队列多窗口服务
    假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时,下一位顾客即去该窗口处理事务。当有多个窗口可选择时,假设顾客总是选择编号最小的窗口。本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间,并且统......
  • Gpssworld仿真(二):并排排队系统模拟
    4.3某一个加油站能够配给三个级别的燃油:①家庭取暖用的燃油;②轻工业用的燃油;③运输用的燃油。每一级别的燃油都有一个对应的油泵。订单中燃油的数量在3000加仑和5000加仑中变化,每次增加10加仑,是均匀分布。这个站点最多能容纳12辆车。来加油站装油的汽车到达的平均时间间隔是18分......