[SDOI2016] 模式字符串 (BZOJ4598 & VIJOS1995)
首先直接点分+hash就可以做,每个点用hash判断是否为S重复若干次后的前缀或后缀,每个子树与之前的结果O(m)暴力合并。在子树大小<m时停止分治,则总复杂度为O(nlog(n/m))。
问题在于n<=1e6。据说有O(n)的DP做法?写点分的话需要一大波常数优化……据说SDOI现场写了这题的全卡常T了……注意BZOJ并没有大数据,如果常数够小的话可以去VIJOS提交。
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long u64;
typedef u64 ll;
const int N=1e6+5;
struct edge{int v;edge*s;}e[N*2];
edge*l1=e,*h[N];
void ins(int u,int v){
edge s={v,h[u]};
*(h[u]=l1++)=s;
}
int q,n,m,s1,s2,s3,d=1,siz[N],f1[N],f2[N],f3[N],f4[N];
bool vis[N];
char t1[N],t2[N];
ll c1[N],c2[N];
u64 ans;
void dfs1(int u,int v){
int s4=0;
s3=max(s3,d++);
siz[u]=1;
for(edge*i=h[u];i;i=i->s)
if(i->v!=v&&!vis[i->v]){
dfs1(i->v,u);
siz[u]+=siz[i->v];
s4=max(s4,siz[i->v]);
}
if(max(s4,s1-siz[u])*2<=s1)
s2=u;
--d;
}
void dfs3(int u,int v,ll w){
++d,w=w*223+t1[u];
if(w==c1[d])++f1[d%m];
if(w==c2[d])++f2[d%m];
for(edge*i=h[u];i;i=i->s)
if(i->v!=v&&!vis[i->v])
dfs3(i->v,u,w);
--d;
}
void dfs2(int u){
s3=0,dfs1(u,0),u=s2;
if(s3*2-1<m)return;
for(int j=0;j<m;++j)
f3[j]=f4[j]=0;
f3[1]=f4[1]=1;
for(edge*i=h[u];i;i=i->s)
if(!vis[i->v]){
for(int j=0;j<m;++j)
f1[j]=f2[j]=0;
dfs3(i->v,u,t1[u]);
for(int j=0;j<m;++j)
ans+=(u64)f1[j]*f4[(m-j+1)%m]+(u64)f2[j]*f3[(m-j+1)%m];
for(int j=0;j<m;++j)
f3[j]+=f1[j],f4[j]+=f2[j];
}
vis[u]=1;
int s5=s1;
for(edge*i=h[u];i;i=i->s)
if(!vis[i->v]){
s1=siz[i->v]<siz[u]?siz[i->v]:s5-siz[u];
if(s1>=m)dfs2(i->v);
}
}
struct buf{
char z[1<<25],*s;
buf():s(z){
z[fread(z,1,sizeof z,stdin)]=0;
}
void pre(char*v){
while(*s<48)++s;
while(*s>32)*v++=*s++;
*v=0;
}
operator int(){
int x=0;
while(*s<48)++s;
while(*s>32)
x=x*10+*s++-48;
return x;
}
}it;
int main(){
q=it;
while(q--){
n=it,m=it,it.pre(t1+1);
for(int i=1;i<=n;++i)
h[i]=0,vis[i]=0;
l1=e;
for(int i=2;i<=n;++i){
int u=it,v=it;
ins(u,v),ins(v,u);
}
it.pre(t2+1);
ll w=1;
int i=1;
int j=m;
for(int k=1;k<=n;++k){
c1[k]=c1[k-1]+w*t2[i];
c2[k]=c2[k-1]+w*t2[j];
w*=223;
if(++i>m)i=1;
if(--j<1)j=m;
}
ans=0,s1=n,dfs2(1);
printf("%llu\n",ans);
}
}
[SDOI2016] 模式字符串 (BZOJ4598 & VIJOS1995)的更多相关文章
- 【BZOJ4598】[Sdoi2016]模式字符串 树分治+hash
[BZOJ4598][Sdoi2016]模式字符串 Description 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m的模式串s,其中每 ...
- P4075 [SDOI2016]模式字符串
总结 P4075 [SDOI2016]模式字符串 题目描述 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m的模式串s,其中每一位仍然是A到z ...
- bzoj4598: [Sdoi2016]模式字符串
Description 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m 的模式串s,其中每一位仍然是A到z的大写字母.Alice希望知道,有 ...
- 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 ...
- 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]\)表示(之前的)子树内 ...
随机推荐
- Tar压缩文件
[root@test /root]# tar [-zxcvfpP] filename [root@test /root]# tar -N 'yyyy/mm/dd' /path -zcvf targ ...
- Python机器学习-分类
监督学习下的分类模型,主要运用sklearn实践 kNN分类器 决策树 朴素贝叶斯 实战一:预测股市涨跌 # -*- coding: utf-8 -*- """ Crea ...
- iPhone 适配之路
(1)1x时代 2007年,初代iPhone公布,屏幕的宽高是320*480像素.这个分辨率一直到iPhone3GS也保持不变. 那时编写iOS的App应用程序.仅仅支持绝对定位. 比方一个butto ...
- mock.js 的用法 -- 脱离后端独立开发,实现增删改查功能
在我们的生产实际中,后端的接口往往是较晚才会出来,并且还要写接口文档,于是我们的前端的许多开发都要等到接口给我们才能进行,这样对于我们前端来说显得十分的被动,于是有没有可以制造假数据来模拟后端接口呢, ...
- OSI七层模型详解(转)
OSI 七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,因此其最主要的功能就是帮助不同类型的主机实现数据传输 . 完成中继功能的节点通常称为中继系统.在OSI七层模型中,处于 ...
- Git多账号登陆
最近工作上遇到了使用git+repo的情况,需要用公司的邮箱和账号名重新申请ssh公私密钥,而我本身在github上也有一些开源项目,这里就是记录一下我是如何实现git多账号登陆的. 取消 ...
- C#实现模拟登录百度并发送私信
首先获取Token,根据Token获取PubliKey,使用RSA加密POST数据 private Regex _regex = new Regex(@"\{.*\}", Rege ...
- FSB总线、HT总线、QPI总线、DMI总线
http://wenku.baidu.com/link?url=d0NQFyvVpU--FpQUIjkPcdE036riitKgKib3385qr7VdB1oNUcIDpRndY-HH4ITjzJln ...
- Django 之 中间件
一.概念 1.什么是中间件? 官方解释:中间件是用来处理Django的请求和响应的框架级别的钩子.基于全局范围产生影响. 平民解释:中间件是帮助我们在视图函数执行前和执行后做的操作.它本质上就是一个自 ...
- wx.request的并发问题
wepyjs - 小程序组件化开发框架 https://tencent.github.io/wepy/document.html#/ 在同时并发10个request请求测试时: 不使用WePY: 使用 ...