bzoj4598: [Sdoi2016]模式字符串
Description
Input
Output
点分治统计答案,hash判定当前点到中心的路径是否是由模式串重复得到的串的前/后缀,为保证复杂度,递归至子树大小不足m时结束,时间复杂度O(Tnlog(n/m))
#include<bits/stdc++.h>
int _(){
int x=,c=getchar();
while(c<)c=getchar();
while(c>)x=x*+c-,c=getchar();
return x;
}
typedef unsigned long long u64;
const int N=1e6+,p=;
int T,n,m;
char s1[N],s2[N];
int es[N*],enx[N*],e0[N],ep=,sz[N],SZ,CG;
u64 h1[N],h2[N],ans;
bool ed[N];
void f2(int w,int pa){
sz[w]=;
for(int i=e0[w],u;i;i=enx[i]){
u=es[i];
if(u==pa||ed[u])continue;
f2(u,w);
sz[w]+=sz[u];
}
}
int md,dw;
void f3(int w,int pa){
if(++dw>md)md=dw;
bool is=sz[w]*>=SZ;
for(int i=e0[w],u;i;i=enx[i]){
u=es[i];
if(u==pa||ed[u])continue;
f3(u,w);
if(sz[u]*>SZ)is=;
}
if(is)CG=w;
--dw;
}
int mod[N];
int t1[N],t2[N],a1[N],a2[N];
void f4(int w,int pa,u64 h,int dep){
h=h*p+s1[w];
if(h==h1[dep])++a1[dep[mod]];
if(h==h2[dep])++a2[dep[mod]];
for(int i=e0[w],u;i;i=enx[i]){
u=es[i];
if(u==pa||ed[u])continue;
f4(u,w,h,dep+);
}
}
void f1(int w){
f2(w,);
SZ=sz[w];
md=dw=;
f3(w,);
w=CG;
ed[w]=;
if(md*<m||SZ<m)return;
memset(t1,,sizeof(int)*(m+));
memset(t2,,sizeof(int)*(m+));
for(int i=e0[w];i;i=enx[i]){
int u=es[i];
if(ed[u])continue;
memset(a1,,sizeof(int)*(m+));
memset(a2,,sizeof(int)*(m+));
f4(u,w,s1[w],);
a1[m]=a1[];
a2[m]=a2[];
a1[m+]=a1[];
a2[m+]=a2[];
ans+=a1[]+a2[];
for(int x=;x<m;++x){
ans+=u64(a1[m+-x])*t2[x];
ans+=u64(a2[m+-x])*t1[x];
}
for(int x=;x<m;++x)t1[x]+=a1[x],t2[x]+=a2[x];
}
for(int i=e0[w];i;i=enx[i]){
int u=es[i];
if(!ed[u])f1(u);
}
}
int main(){
for(T=_();T;--T){
ans=;
n=_();m=_();
memset(e0,,sizeof(int)*(n+));
memset(ed,,n+);
scanf("%s",s1+);
for(int i=,a,b;i<n;++i){
a=_();b=_();
es[ep]=b;enx[ep]=e0[a];e0[a]=ep++;
es[ep]=a;enx[ep]=e0[b];e0[b]=ep++;
}
scanf("%s",s2+);
u64 pp=;
for(int i=,j=,k=m;i<=n;++i,pp*=p){
mod[i]=i%m;
h1[i]=s2[j]*pp+h1[i-];
h2[i]=s2[k]*pp+h2[i-];
if(m<++j)j=;
if(!--k)k=m;
}
if(m>)f1();
else for(int i=;i<=n;++i)if(s1[i]==s2[])++ans;
printf("%llu\n",ans);
}
return ;
}
bzoj4598: [Sdoi2016]模式字符串的更多相关文章
- BZOJ4598 [Sdoi2016]模式字符串 【点分治 + hash】
题目 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m 的模式串s,其中每一位仍然是A到z的大写字母.Alice希望知道,有多少对结点< ...
- Bzoj4598: [Sdoi2016]模式字符串 点分治 哈希
国际惯例的题面:这种关于树上路径的题,我也没什么好办法,只好点分治.考虑当前分治重心为root,如何统计经过分治重心的路径的答案.我们令prf[i]表示某个点到root的路径(不含root)已经循环匹 ...
- BZOJ4598: [Sdoi2016]模式字符串(点分治 hash)
题意 题目链接 Sol 直接考虑点分治+hash匹配 设\(up[i]\)表示\(dep \% M = i\)的从下往上恰好与前\(i\)位匹配的个数 \(down\)表示\(dep \% M = i ...
- 【BZOJ4598】[Sdoi2016]模式字符串 树分治+hash
[BZOJ4598][Sdoi2016]模式字符串 Description 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m的模式串s,其中每 ...
- P4075 [SDOI2016]模式字符串
总结 P4075 [SDOI2016]模式字符串 题目描述 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m的模式串s,其中每一位仍然是A到z ...
- [SDOI2016] 模式字符串 (BZOJ4598 & VIJOS1995)
首先直接点分+hash就可以做,每个点用hash判断是否为S重复若干次后的前缀或后缀,每个子树与之前的结果O(m)暴力合并.在子树大小<m时停止分治,则总复杂度为O(nlog(n/m)). 问题 ...
- bzoj 4598: [Sdoi2016]模式字符串
题目描述 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m的模式串s,其中每一位仍然是A到z的大写字母. Alice希望知道,有多少对结点&l ...
- [SDOI2016]模式字符串
Description 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m的模式串s,其中每一位仍然是A到z的大写字母.Alice希望知道,有多 ...
- BZOJ.4598.[SDOI2016]模式字符串(点分治 Hash)
LOJ BZOJ 洛谷 点分治.考虑如何计算过\(rt\)的答案. 记\(pre[i]\)表示(之前的)子树内循环匹配了\(S\)的前缀\(i\)的路径有多少,\(suf[i]\)表示(之前的)子树内 ...
随机推荐
- Java进阶3. 内存回收机制
Java进阶3. 内存回收机制 20131029 前言: 学过C++的都知道,C++中内存需要程序员自己维护.说道这里,很多开发的同学就感觉很痛苦,当他转向Java的时候,就会说你看Java多好啊,程 ...
- java程序设计基础篇 复习笔记 第四单元
1 think before coding code incrementally 2 sentinel value sentinel-controlled loop 3 输入输出重定向 > &l ...
- windows下的一些命令
dir 相当于linux下的ls clear 清屏 netstat 活动连接 | 管道命令 findstr 查询类似linux的grep tasklist 查看进程列表 taskkill 杀死进程 d ...
- InfluxDB使用纪录
我是Mac环境 1.安装 brew install influxdb 安装完成后,默认目录为/usr/local/opt/influxdb. 2.安装完成后,打开influxdb服务. $ influ ...
- Xen,VMware ESXi,Hyper-V和KVM等虚拟化技术的原理解析
Xen,VMware ESXi,Hyper-V和KVM等虚拟化技术的原理解析 2018年04月03日 13:51:55 阅读数:936 XEN 与 VMware ESXi,Hyper-V 以及 K ...
- Springboot yml获取系统环境变量的值
注意,这里说的是获取系统环境变量的值,譬如Windows里配置的JAVA_HOME之类的,可以直接在Springboot的配置文件中获取. 我们经常使用一些docker管理平台,如DaoCloud.r ...
- phpcms后台主菜单不显示
phpcms\modules\admin\templates\main.tpl.php 注释掉既可
- HihoCoder 1075 开锁魔法III(概率DP+组合)
描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它 ...
- HihoCoder1050 树中的最长路 树形DP第三题(找不到对象)
题意:求出的树中距离最远的两个结点之间相隔的距离. 水题一道,以前只会用路的直径来解. 代码如下: #include<cstdio> #include<cstdlib> #in ...
- crt,excrt学习总结
\(crt,Chinese\ Remainder\ Theorem\) 概述 前置技能:同余基础性质,\(exgcd\). \(crt\),中国剩余定理.用于解决模数互质的线性同余方程组.大概长这样: ...