当前位置: 首页 > 编程日记 > 正文

bzoj3467: Crash和陶陶的游戏

就一篇题解:

BZOJ3467 : Crash和陶陶的游戏 - weixin_34248487的博客 - CSDN博客

1.离线,建出Atrie树;B树的倍增哈希数组,节点按照到根路径字典序排序

2.处理A节点对应前缀对应B中的极长可以匹配的区间。在父亲节点区间内二分即可

3.更新答案:

①加入A点,找区间中B中已经出现点个数。树状数组

②加入B点,本质是B到根的字符串放在trie最大匹配长度,二分,哈希表存A树是否有这个前缀,得到的长度就是当前匹配长度。

直上直下的链本质是字符串的前缀后缀。

动态更新hash很难,就离线,在可能贡献的集合内找到当前出现的。

假装有代码.jpg

这个是两个logn的

可以变成一个logn!

sort是不必要的,

对于②B树点对trie的影响,不妨直接倍增+hash找到最长的匹配位置y,在y的位置++,然后①时候子树查询即可!

通过提前打好标记使得不用同时考虑很多!

(类似预处理)

还有可能一个点有多个c儿子,要合并成一个。①的时候整个子树++,表示到根的路径上多了一个点,②的时候,匹配最长位置单点查询这个值

两个树状数组

注意,unsigned long long哈希

单模数随便rand就卡掉了

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define ul unsigned long long
#define ll unsigned long long
using namespace std;
il void rd(int &x){char ch;x=0;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);for(x=numb;isdigit(ch=getchar());x=x*10+numb);(fl==true)&&(x=-x);
}
template<class T>il void output(T x){if(x/10)output(x/10);putchar(x%10+'0');}
template<class T>il void ot(T x){if(x<0) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}namespace Miracle{
const int N=2e5+5;
const ul base=233;
const int orz=100000;struct HA{int nxt[N],hd[N],cnt;ul val[N];int id[N];void ins(int x,ll h){int pos=h%orz;nxt[++cnt]=hd[pos];hd[pos]=cnt;val[cnt]=h;id[cnt]=x;}int query(ll h){int pos=h%orz;for(reg i=hd[pos];i;i=nxt[i]){if(val[i]==h) return id[i];}return -1;}
}ha;
//trie
int ch[N][26];
int id[N];//is
int n;
int tot;
int lp;
ul pw[(1<<17)+233];
void ins(int x,int c){++lp;x=id[x];
//    cout<<" true fa "<<x<<" ch "<<ch[x][c]<<endl;if(ch[x][c]){id[lp]=ch[x][c];return;}id[lp]=++tot;ch[x][c]=tot;
}
int dfn[N],df,dfn2[N];
void fin(int x,ul haxi,int d){dfn[x]=++df;if(x!=1){ha.ins(x,haxi);}for(reg i=0;i<26;++i){if(ch[x][i]){fin(ch[x][i],haxi+(ll)pw[d]*(i+1),d+1);}}dfn2[x]=df;
}
//B tree
int cur;
struct node{int nxt,to;int val;
}e[2*N];
int hd[N],cnt;
void add(int x,int y,int z){e[++cnt].nxt=hd[x];e[cnt].to=y;e[cnt].val=z;hd[x]=cnt;
}
int fa[N][18];
ul hsh[N][18];
void dfs(int x){for(reg i=hd[x];i;i=e[i].nxt){int y=e[i].to;fa[y][0]=x;hsh[y][0]=e[i].val+1;dfs(y);}
}
//question
struct que{int typ,fa,c;int x;
}q[N];int get(int x){ll now=0;int has=0;int ret=0;for(reg j=17;j>=0;--j){if(!fa[x][j]) continue;ll tmp=((ll)now+pw[has]*hsh[x][j]);int nc=ha.query(tmp);if(nc!=-1){ret=nc;now=tmp;has+=(1<<j);x=fa[x][j];//shit
        }}return ret;
}struct treearray{int f[N];int n;void upda(int x,int c){for(;x<=n;x+=x&(-x)) f[x]+=c;}int query(int x){int ret=0;for(;x;x-=x&(-x)) ret+=f[x];return ret;}
}t1,t2;
int main(){rd(n);char s[233];++tot;++cur;//startlp=1;id[1]=1;ll ans=0;ans=1;//1 1for(reg i=1;i<=n;++i){rd(q[i].typ);rd(q[i].fa);//rd(q[i].c);scanf("%s",s+1);q[i].c=s[1]-'a';if(q[i].typ==1){ins(q[i].fa,q[i].c);q[i].x=id[lp];
//            prt(id,1,lp);}else{++cur;q[i].x=cur;add(q[i].fa,cur,q[i].c);}
//        cout<<tot<<" ";
    }
//    cout<<endl<<endl;dfs(1);
//    cout<<"after dfs "<<tot<<endl;
//    prt(id,1,lp);
    pw[0]=1;for(reg i=1;i<=(1<<17);++i){pw[i]=(ll)pw[i-1]*base;//%mod;
    }for(reg j=1;j<=17;++j){for(reg i=1;i<=cur;++i){fa[i][j]=fa[fa[i][j-1]][j-1];hsh[i][j]=((ll)hsh[i][j-1]+(ll)hsh[fa[i][j-1]][j-1]*pw[1<<(j-1)]);//%mod)%mod;
        }}
//    cout<<"after bezeng "<<endl;fin(1,0,0);
//    cout<<" after fin "<<endl;t1.n=t2.n=tot;
//    cout<<" tot "<<tot<<endl;
//    prt(dfn,1,tot);
//    cout<<" dfn2-------------------------- "<<endl;
//    prt(dfn2,1,tot);int tc=0,tb=0;for(reg i=1;i<=n;++i){if(q[i].typ==1){//add trie++tc;
//            cout<<"trie "<<endl;int x=q[i].x;//ch[id[q[i].fa]][q[i].c];
//            cout<<"x "<<x<<" tc "<<tc<<endl;ans+=t1.query(dfn2[x])-t1.query(dfn[x]-1);t2.upda(dfn[x],1);t2.upda(dfn2[x]+1,-1);}else{//add B tree++tb;
//            cout<<" Btree "<<endl;
//            cout<<" x "<<q[i].x<<endl;int y=get(q[i].x);
//            cout<<" y "<<y<<" tb "<<tb<<" dfn "<<dfn[y]<<endl;if(y){ans+=t2.query(dfn[y]);t1.upda(dfn[y],1);}++ans;}printf("%lld\n",ans);}return 0;
}}
signed main(){
//    freopen("5.in","r",stdin);
//    freopen("my.out","w",stdout);
    Miracle::main();return 0;
}/*Author: *Miracle*Date: 2019/3/26 18:56:24
*/
View Code

转载于:https://www.cnblogs.com/Miracevin/p/10573991.html

相关文章:

载入图像并且显示

#include <opencv2/opencv.hpp> using namespace cv;void main( ) { const char *fileName "1.jpg";Mat srcImage imread("1.jpg");imshow(fileName,srcImage);waitKey(0); }

alter system switch logfile与alter system archive log current的区别

以前知道 ALTER SYSTEM SWITCH LOGFILE对单实例数据库或RAC中的当前实例执行日志切换&#xff0c; ALTER SYSTEM ARCHIVE LOG CURRENT会对数据库中的所有实例执行日志切换&#xff0c; 所以在RAC环境上大多时间一般使用后者&#xff0c;而今天遇到了不管执行多少次ALTER SYSTEM…

【C++】【六】约瑟夫问题

核心代码&#xff1a; int index 1;clinknode* pcur list->head.next;while (Size_circlelinkist(list)>1){if (index N) {mynum* temnum (mynum*)pcur;printf("%d ", temnum->val);clinknode* pnext pcur->next;RemoveByValue_circlelinkist(list…

第六章:内核数据结构

6.1链表链表表示一种存放和操作的可变数据元素的数据结构。链表与静态数组不同的是它包含的元素是动态创建并且插入链表的&#xff0c;在编译时不必知道具体需要多少个元素。另外链表中每个元素的创建时间各不相同&#xff0c;所以它们在内存中无需占用连续的空间。链表中每个元…

【C++】【七】栈的实现

栈的线性表实现 stack_liner_stack.h #ifndef STACK_LINER_H #define STACK_LINER_H #include <stdlib.h> #define MAX_SIZE 1024 #define stack_liner_false 0 #define stack_liner_true 1typedef struct STACK_LINER_H {void* data[MAX_SIZE];int size; }stack_liner…

推荐两款简单好用的图片放大jquery插件

一、zoomfiy.js 推荐可以从这里下载 使用说明&#xff1a; 使用该jquery 插件引入该插件的js:zoomfiy.js 或 min引入该插件的css:zoomfiy.css 或 min前后顺序都可js里加入 调用插件的函数 $(这里写要放大的图片).zoomify();如果有ajax 新生成的图片&#xff0c;要在ajax里再次调…

对图像的缩放与旋转

#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" int main( ) {// 读取图像cv::Mat srcImage cv::imread("..\\images\\flower3.jpg");// 图像读取是否成功if( !srcImage.data ) return 1; // 对图像的缩放与旋…

工具库 --- Validator (JS正则)

工具库 --- Validator 今天写的是一个正则验证类 单例模式 工具库地址&#xff1a;github.com/WeForStudy/… npm地址&#xff1a;www.npmjs.com/package/slm… 单例模式 减少不必要的对象生存&#xff0c;减少资源的占用 由于只需要new一次&#xff0c;项目中其他项目共用一个…

【C++】【九】栈的应用

【C】【九】栈的应用 就近匹配原理及其步骤&#xff1a; 中缀转后缀&#xff1a;

linux中错误日志等级

info&#xff1a;仅是一些基本的讯息说明而已&#xff1b;notice&#xff1a;比 info 还需要被注意到的一些信息内容&#xff1b;warning 或 warn&#xff1a;警示讯息&#xff0c;可能有问题&#xff0c;但是还不至于影响到某个 daemon 作。err 或 error &#xff1a;一些重大…

Mat类简略结构

class CV_EXPORTS Mat { public&#xff1a;int flags; // 标志位 int dims ; // 数组的维数int rows,cols; uchar *data ; // 指向数据的指针int * refcount ; // 指针的引用计数器 阵列指向用户分配的数据时&#xff0c;当指针为 NULL };

数据结构之快速排序

首先快速排序&#xff1a;就是选择一个基数&#xff0c;然后从两端依次进行比较&#xff0c;若右边大于基数&#xff0c;则不进行交换&#xff0c;直到右边的数据小于基数&#xff0c;然后冲左边开始和基数比较&#xff0c;若左边的小于基数&#xff0c;则进行下一个比较&#…

【C++】【十】二叉树

树的基本概念&#xff1a; 树具有递归性&#xff0c;非线性 完全二叉树 &#xff1a;所有节点都在 举例&#xff1a; 递归遍历二叉树&#xff1a; #include <stdlib.h> #include <stdio.h> #include <iostream> #include<string.h>typedef struct B…

记一次网络共享打印机故障

刚开始去到办公室发现电脑之间的环境是XP跟WIN10查看共享主机发现没有监听139和445端口 然后在网卡属性把Microsoft网络客户端和Microsoft网络的文件和打印机共享删除重启 重新安装这两个客户端 发现虽然共享主机有监听端口 但是其他主机还是不能访问 最后检查发现主机之间的工…

Mat 类常用函数用法示例

#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <iostream> int main( ) {cv::Mat Image1( 10, 8, CV_8UC1, cv::Scalar(5) );// 矩阵行列数获取std::cout << "Image1 row: " << I…

记录智能指针使用shared_ptr使用错误

shared_ptr为智能指针&#xff0c;今天一次在使用shared_ptr时&#xff0c;错误的将其初始化方式写为shared_ptr<T> test shared_ptr<T>(),随后导致崩溃 正确做法是shared_ptr<T> test make_shared<T>() 或shared_ptr<T> test shared_ptr<…

【C++】【十一】二叉树递归遍历与非递归遍历的实现及思路

非递归遍历实现思路&#xff1a; #include <stdlib.h> #include <stdio.h> #include <iostream> #include <string.h>typedef struct LINKNODE {struct LINKNODE* next; }linknode;typedef struct LINKLIST {linknode head;int size; }stack_list;#…

定时调度模块:sched

定时调度模块:sched """A generally useful event scheduler class. 事件调度器类Each instance of this class manages its own queue. 类的每一个实例独立管理自己的队列 No multi-threading is implied; you are supposed to hack that yourself, or use a s…

Mat转换为IplImage 类型和CvMat 类型

cv::Mat img; CvMat cvMatImg img; IplImage IplImg img;转载&#xff1a;http://blog.csdn.net/zhuwei1988

大数据学习思路

学习大数据已经有一段时间了&#xff0c;抽空回顾一下自己学习的一些内容。下图主要为自己学习大数据的一个过程。 阶段一&#xff1a;Java基础 掌握JAVA基本语法、面向对象、集合、IO流、多线程、网络编程 阶段二&#xff1a;MySQL CRUD 阶段三&#xf…

【C++】【十二】排序实现及思路

掌握核心知识点&#xff1a; 1.插入排序在一下2种情况效率较高&#xff1a;1&#xff09;数据基本有序 2&#xff09;数据序列较少 希尔排序是在插入排序的基础上的改进。 2.快速排序 3.归并排序 4.堆排序&#xff1a;数据初始化为数据&#xff0c;根据完全二叉树&#…

Centos 不小心删除了openssl,导致无法使用sshd、yum、wget、curl 等软件的问题。。...

2019独角兽企业重金招聘Python工程师标准>>> 1、如果安装了FTP&#xff0c;可以使用FTP上传rpm到服务器进行安装&#xff1b; 2、挂载光驱cdrom到mnt文件夹下&#xff0c;进入package文件夹rpm进行安装&#xff1b; 3、有源码包进行源码安装&#xff1b; 4、自求多福…

IplImage 类型和 CvMat 类型转换为 Mat 类型

IplImage *IplImg cvLoadImage("fruits.jpg"); Mat img(IplImg, true);转载&#xff1a;http://blog.csdn.net/zhuwei1988

麦当劳数字化转型中获得的6个数据科学经验

摘要 美国大数据公司Civis Analytics于2017年底与麦当劳北美市场营销和数据科学团队建立了数据技术合作伙伴关系&#xff0c;经过一年半的努力&#xff0c;近期在纽约广告周上共同展示了一些重要的学习成果。 麦当劳客户数据科学总监David Galinsky和麦当劳媒体科学经理Emma Hi…

操作系统(三)

学习记录&#xff08;3&#xff09; 线程 1.线程的优势在哪&#xff1f; 1.1 多线程之间会共享同一块地址空间和所有可用数据的能力&#xff0c;这是进程所不具备的。 1.2 线程要比进程更轻量级&#xff0c;由于线程更轻&#xff0c;所以它比进程更容易创建&#xff0c;也更容…

【Kubernetes】两篇文章 搞懂 K8s 的 fannel 网络原理

近期公司的flannel网络很不稳定&#xff0c;花时间研究了下并且保证云端自动部署的网络能够正常work。 1.网络拓扑 拓扑如下&#xff1a;&#xff08;点开看大图&#xff09; 容器网卡通过docker0桥接到flannel0网卡&#xff0c;而每个host对应的flannel0网段为 10.1.x.[1-255…

图像读取、转为灰度图像、均值平滑、显示保存操作

#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> int main( ) {// 读取图像源cv::Mat srcImage cv::imread("..\\images\\pool.jpg");if( srcImage…

python 查询 elasticsearch 常用方法(Query DSL)

2019独角兽企业重金招聘Python工程师标准>>> 1. 建立连接 from elasticsearch import Elasticsearch es Elasticsearch(["localhost:9200"])2. 查询所有数据 # 方式1&#xff1a; es.search(index"index_name", doc_type"type_name"…

OpenCV 【十一】—— 图像去畸变,对极约束之undistort,initUndistortRectifyMap,undistort

目录 0.极限约束&#xff0c;对极校正 1.摄像机成像原理简述 2.成像畸变 2.1. 畸变数学模型 2.2. 公式推导 3.畸变校正 3.1. 理论推导 4. 图像去畸变** 5. 图像尺度缩放与内参的关系** 5.1 undistortPoints() 5.2 initUndistortRectifyMap() 5.3 undistort() 6.Un…

Ubuntu14.04 Mininet中将Openvswitch升级步骤

2019独角兽企业重金招聘Python工程师标准>>> 首先下载Mininet apt-get install mininetservice openvswitch-controller stopupdate-rc.d openvswitch-controller disablemn --test pingall 这里可能会出现以下错误sudo mn --mac --controllerremote,port6653 --top…