Bzoj4212--神牛养成计划

正规题解传送门 : https://zyqn.tech/?p=3163

但是我们发现n只有2000,于是可以建出trie树然后愉快的bitset去搞。

直接对于trie上每个节点开个bitset空间爆炸。但是有很多是重复的,所以我们想虚树一样建,每个节点只存一个link指针。

代码 :

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define eps 1e-9
#define LL long long
using namespace std;

#define int int
inline int Max(int a,int b) {return a>b?a:b;}
inline int Min(int a,int b) {return a<b?a:b;}
inline int Sqr(int a) {return a*a;}
inline int Abs(int a) {return a>0?a:-a;}
#undef int

#define MAXN 2000006

int n,m,ans;
bitset<2005> x,pol[100005];int tot;
char s[MAXN];

struct Trie{
    int tra[MAXN][27],lk[MAXN],cnt;
    void Init() {
        memset(tra,0,sizeof(tra));
        cnt=1;
    }

    void Build(int v) {
        int fr=0;
        for(int i=0;i<27;i++) {
            if(!tra[v][i]) continue;
            Build(tra[v][i]);
            if(!fr) lk[v]=lk[tra[v][i]],fr=1;
            else if(fr==1) {
                tot++;pol[tot]=pol[lk[v]];
                pol[tot]|=pol[lk[tra[v][i]]];
                lk[v]=tot;fr=2;
            }
            else pol[lk[v]]|=pol[lk[tra[v][i]]];
        }
    }

    void Insert(int k,char *s,int len) {
        int now=1;
        for(int i=0;i<len;i++) {
            if(!tra[now][s[i]-‘a‘]) now=tra[now][s[i]-‘a‘]=++cnt;
            else now=tra[now][s[i]-‘a‘];
        }
        if(!lk[now]) lk[now]=++tot;
        pol[lk[now]][k]=1;
    }
    int Patten(char *s,int len) {
        int now=1;
        for(int i=0;i<len;i++) {
            if(!tra[now][s[i]-‘a‘]) return 0;
            now=tra[now][s[i]-‘a‘];
        }
        return lk[now];
    }
}hd,bk;

inline void Updata(int n) {
    for(int i=0;i<n;i++)
        s[i]=((s[i]-‘a‘+ans)%26)+‘a‘;
}

int main() {
    hd.Init();bk.Init();
    scanf("%d",&n);
    for(int len,i=1;i<=n;i++) {
        scanf("%s",s);
        len=strlen(s);
        hd.Insert(i,s,len);
        reverse(s,s+len);
        bk.Insert(i,s,len);
    }
    hd.Build(1);
    bk.Build(1);
    scanf("%d",&m);
    for(int len,i=1;i<=m;i++) {
        x.set();
        scanf("%s",s);
        len=strlen(s);
        Updata(len);
        x&=pol[hd.Patten(s,len)];

        scanf("%s",s);
        len=strlen(s);
        reverse(s,s+len);
        Updata(len);
        x&=pol[bk.Patten(s,len)];

        ans=x.count();
        printf("%d\n",ans);
    }
    return 0;
}

时间: 2024-10-26 22:15:30

Bzoj4212--神牛养成计划的相关文章

Web前端开发工程师养成计划【转载】

Web前端开发工程师养成计划(入门篇) 最原始的忠告:这个世界上有想法的人很多,但是有想法又能实现它的人太少! 首先要感谢伟大的Web2.0概念.产品概念.用户体验概念.jQuery插件,是它们在中国日渐成熟才解放了一直以来姥姥不疼舅舅不爱的前端开发工程师们. 有没有发现从09年下半年到现在全中国的互联网公司都在招聘前端开发工程师?如果你注意到了,那么恭喜你,你已经拥有那么一点点预测互联网职场动向的能力. 可能令你感到遗憾的是你从没从事过前端开发工作,不过没关系,只要你肯努力,一切都是可以学会的

爱今天养成计划

爱今天养成计划 第一阶段 第一阶段 7 天 每天打开今天 只记录一件事 每二阶段 每二阶段 21 天 简单备注投资事件. 一定要每天记录 每三阶段 第三阶段 90 天 全天记录,包括睡眠. 每天在规定时间里总结,可以是晚上的某个时间. 习惯养成 再结合其它的任务管理来安排自己的时间 推荐滴答清单 原文地址:https://www.cnblogs.com/F4NNIU/p/9298169.html

腾讯犀牛鸟「云开发」校园技术布道师养成计划

人才竞争日益激烈,如何构建一个具有市场竞争力的能力模型?是值得每一个开发者思考的话题.无论你是在校生,还是在职开发者,未雨绸缪,方能抓住机遇. 如何在大学规划你的技术职业生涯? 如何找准合适的技术方向? 如何提升技术实力? 如何构建技术社区影响力? 假若有一天,你想转型产品经理,又如何实现从技术向产品的华丽转身? 腾讯犀牛鸟云开发校园布道师养成计划之[大咖线上分享],邀请京东.腾讯等优秀产品经理和工程师,与大家分享他们的成长历程和经验,为你指点迷津! 从3月6日起,每周五,腾讯犀牛鸟云开发校园布

【bzoj4212】神牛的养成计划 Trie树+可持久化Trie树

题目描述 Hzwer成功培育出神牛细胞,可最终培育出的生物体却让他大失所望...... 后来,他从某同校女神 牛处知道,原来他培育的细胞发生了基因突变,原先决定神牛特征的基因序列都被破坏了,神牛hzwer很生气,但他知道基因突变的低频性,说不定还有以下优秀基因没有突变,那么他就可以用限制性核酸内切酶把它们切出来,然后再构建基因表达载体什么的,后面你懂的...... 黄学长现在知道了N个细胞的DNA序列,它们是若干个由小写字母组成的字符串.一个优秀的基因是两个字符串s1和s2,当且仅当s1是某序列

JAVA程序员养成计划之JVM学习笔记(2)-垃圾收集管理

本文对JVM垃圾收集进行说明,包括三种不同算法(标记复制.标记清除.标记整理),以及七种不同的垃圾收集器(Serial,ParNew,Serial Scavenge, CMS, Serial Old, Parallel Old, G1) 持续更新中- - 1. 垃圾回收相关概念 1.1. 垃圾回收对象 说到垃圾收集,首先得确定哪些是可回收的对象,这里涉及到java的四种引用方式,即强.软.弱.虚四类引用. 强引用:即普遍存在的对对象的引用,如指向通过new创建的对象 软引用:即程序运行非必须的对

【转】游戏程序员养成计划

博客出处:www.cnblogs.com/clayman/archive/2009/05/17/1459001.html 作者:clayman 与玩游戏相比,写游戏要复杂上千万倍,除了需要掌握通用的编程技巧以外,还要有相当的图形学,物理,数学基础,特别是在国内,由于相关资料的缺乏,更是让初学者无从下手.下面总结了一些入门方法和比较容易入手的资料. 首先你要精通一门高级语言,pc上游戏的首选语言就是C++.其次,要有良好的英文阅读能力.对游戏开发者来说英文阅读能力是最重要也是最基本的工具之一,因为

java大神养成计划

java程序员职业规划第一步: 1.基础必备:至少看过 2.本语言基础书和一本领域技术书. 3.部分参与项目1-2个. java程序员职业规划第二步: 1.行业知识领悟.扩展相关应用知识. 2.完整参与项目1-2个. 3.可以指导新人完成工作.   java程序员职业规划第三步: 1.深刻理解面对对象知识.熟悉常用架构,对公司采用的架构能提出改善意见. 2.参与需求讨论并能提出简化方案. 3.能为决策提出一些建议.   java程序员职业规划第四步: 1.能够对整体需求方案做出精确描述. 2.运

慕课网-Linux达人养成计划学习笔记

mkdir -p [目录]创建目录-p 递归创建ls 查看当前目录下的文件和目录等其他文件 cd [目录]命令英文愿意:change directory切换所在目录简化操作cd ~ 进入当前用户的家目录cdcd - 进入上次目录cd .. 进入上级目录cd . 进入当前目录 linux 的Tab键可以自动补全文件名称或命令名称 pwd查询所在目录位置命令英文愿意:print working directory rmdir [目录名]命令英文原意:remove empty directories作

linux达人养成计划学习笔记(六)—— 挂载命令

一.查询与自动挂载 mount #查询系统中已挂载的设备 mount -a #根据配置文件/etc/fstab的内容,自动挂载 二.挂载命令格式 mount [-t 文件系统] [-o 特殊选项] 设备文件名 挂载点 三.挂载光盘 1.建立挂载点 mkdir /mnt/cdrom/ 2.挂载光盘 mount -t iso9660 /dev/cdrom /mnt/cdrom 两个等价(cdrom是sr0的软连接)mount -t iso9660 /dev/sr0 /mnt/cdrom 四.卸载命令