题目链接

洛谷:https://www.luogu.org/problemnew/show/P4075

LOJ:https://loj.ac/problem/2065

Solution

这种题看起来就很点分治啊...

我们可以发现,我们需要一个支持询问字符串相等,并且支持在一个串前面加一个串的数据结构,显然我们用哈希就行了。

那么我们直接开桶然后拿哈希维护,总复杂度\(O(Tn\log n)\)。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. template<typename T> void read(T &x) {
  4. x=0;T ff=1;char ch=getchar();
  5. for(;!isdigit(ch);ch=getchar()) if(ch=='-') ff=-ff;
  6. for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=ff;
  7. }
  8. void print(int x) {
  9. if(x<0) putchar('-'),x=-x;
  10. if(!x) return ;print(x/10),putchar(x%10+48);
  11. }
  12. void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}
  13. #define lf double
  14. #define ll long long
  15. #define pii pair<int,int >
  16. #define vec vector<int >
  17. #define pb push_back
  18. #define mp make_pair
  19. #define fr first
  20. #define sc second
  21. #define FOR(i,l,r) for(int i=l,i##_r=r;i<=i##_r;i++)
  22. const int maxn = 1e6+10;
  23. const int inf = 1e9;
  24. const lf eps = 1e-8;
  25. const int bs = 29;
  26. const int mod = 1e6+3;
  27. ll ans;
  28. char s[maxn];
  29. int sz[maxn],rs[maxn],rp[maxn],rt,f[maxn],SZ,mxd,rrs[maxn],rrp[maxn];
  30. int n,m,r[maxn],tag[maxn],head[maxn],tot,len,suf[maxn],pre[maxn],pw[maxn],vis[maxn];
  31. struct edge{int to,nxt;}e[maxn<<1];
  32. void add(int u,int v) {e[++tot]=(edge){v,head[u]},head[u]=tot;}
  33. void ins(int u,int v) {add(u,v),add(v,u);}
  34. void prepare() {
  35. for(len=m;len<n;len+=m)
  36. for(int i=len+1;i<=len+m;i++) tag[i]=tag[i-len];
  37. for(int i=1;i<=len;i++) pre[i]=(pre[i-1]*bs+tag[i])%mod;
  38. suf[len+1]=0;for(int i=len;i;i--) suf[i]=(suf[i+1]*bs+tag[i])%mod;
  39. reverse(suf+1,suf+len+1);
  40. pw[0]=1;for(int i=1;i<=len;i++) pw[i]=pw[i-1]*bs%mod;
  41. }
  42. void get_rt(int x,int fa) {
  43. sz[x]=1,f[x]=0;
  44. for(int i=head[x];i;i=e[i].nxt)
  45. if(e[i].to!=fa&&!vis[e[i].to]) get_rt(e[i].to,x),sz[x]+=sz[e[i].to],f[x]=max(f[x],sz[e[i].to]);
  46. f[x]=max(f[x],SZ-sz[x]);if(f[rt]>f[x]) rt=x;
  47. }
  48. void calc(int x,int fa,int dep,int hs,const int &c) {
  49. hs=(hs+1ll*r[x]*pw[dep])%mod;dep++;mxd=max(mxd,dep);
  50. if(hs==pre[dep]) {
  51. rrp[dep%m]++;
  52. if(c==tag[dep%m+1]) ans+=rs[m-dep%m-1];
  53. }
  54. if(hs==suf[dep]) {
  55. rrs[dep%m]++;
  56. if(c==tag[m-dep%m]) ans+=rp[m-dep%m-1];
  57. }
  58. for(int i=head[x];i;i=e[i].nxt) if(e[i].to!=fa&&!vis[e[i].to]) calc(e[i].to,x,dep,hs,c);
  59. }
  60. void dfs(int x) {
  61. f[rt=0]=maxn;get_rt(x,0);x=rt;vis[x]=1;mxd=0;
  62. rp[0]=rs[0]=1;int mmxd=0;
  63. for(int i=head[x];i;i=e[i].nxt)
  64. if(!vis[e[i].to]) {
  65. mxd=0;calc(e[i].to,x,0,0,r[x]);mmxd=max(mmxd,mxd);
  66. for(int j=0;j<=min(mxd,m);j++) rp[j]+=rrp[j],rs[j]+=rrs[j],rrp[j]=rrs[j]=0;
  67. }
  68. for(int i=0;i<=mmxd;i++) rs[i]=rp[i]=0;
  69. for(int i=head[x];i;i=e[i].nxt)
  70. if(!vis[e[i].to]) SZ=sz[e[i].to],dfs(e[i].to);
  71. }
  72. void solve() {
  73. read(n),read(m);scanf("%s",s+1);ans=0;
  74. for(int i=1;i<=n;i++) r[i]=s[i]-'A'+1;
  75. for(int x,y,i=1;i<n;i++) read(x),read(y),ins(x,y);
  76. scanf("%s",s+1);
  77. for(int i=1;i<=m;i++) tag[i]=s[i]-'A'+1;
  78. prepare();SZ=n;dfs(1);write(ans);
  79. }
  80. #define clr(x) memset(x,0,(n+3)*4)
  81. void clear() {clr(head),clr(vis);tot=0;}
  82. int main() {
  83. int st=clock();
  84. int t;read(t);while(t--) solve(),clear();
  85. cerr << (double)(clock()-st)/1e3 << endl;
  86. return 0;
  87. }

[LOJ2065] [SDOI2016]模式字符串的更多相关文章

  1. 【BZOJ4598】[Sdoi2016]模式字符串 树分治+hash

    [BZOJ4598][Sdoi2016]模式字符串 Description 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m的模式串s,其中每 ...

  2. P4075 [SDOI2016]模式字符串

    总结 P4075 [SDOI2016]模式字符串 题目描述 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m的模式串s,其中每一位仍然是A到z ...

  3. bzoj4598: [Sdoi2016]模式字符串

    Description 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m 的模式串s,其中每一位仍然是A到z的大写字母.Alice希望知道,有 ...

  4. bzoj 4598: [Sdoi2016]模式字符串

    题目描述 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m的模式串s,其中每一位仍然是A到z的大写字母. Alice希望知道,有多少对结点&l ...

  5. BZOJ4598 [Sdoi2016]模式字符串 【点分治 + hash】

    题目 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m 的模式串s,其中每一位仍然是A到z的大写字母.Alice希望知道,有多少对结点< ...

  6. [SDOI2016]模式字符串

    Description 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m的模式串s,其中每一位仍然是A到z的大写字母.Alice希望知道,有多 ...

  7. BZOJ.4598.[SDOI2016]模式字符串(点分治 Hash)

    LOJ BZOJ 洛谷 点分治.考虑如何计算过\(rt\)的答案. 记\(pre[i]\)表示(之前的)子树内循环匹配了\(S\)的前缀\(i\)的路径有多少,\(suf[i]\)表示(之前的)子树内 ...

  8. Bzoj4598: [Sdoi2016]模式字符串 点分治 哈希

    国际惯例的题面:这种关于树上路径的题,我也没什么好办法,只好点分治.考虑当前分治重心为root,如何统计经过分治重心的路径的答案.我们令prf[i]表示某个点到root的路径(不含root)已经循环匹 ...

  9. BZOJ4598: [Sdoi2016]模式字符串(点分治 hash)

    题意 题目链接 Sol 直接考虑点分治+hash匹配 设\(up[i]\)表示\(dep \% M = i\)的从下往上恰好与前\(i\)位匹配的个数 \(down\)表示\(dep \% M = i ...

随机推荐

  1. Linux 系统管理——文件系统与LVM、磁盘配额实例

    1.为主机增加80G SCSI 接口硬盘 2.划分三个各20G的主分区 3.将三个主分区转换为物理卷(pvcreate),扫描系统中的物理卷 4.使用两个物理卷创建卷组,名字为myvg,查看卷组大小 ...

  2. ·分布式文件系统HDFS 练习

    作业要求来源于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3292 1.目录操作 在HDFS中为hadoop用户创建一个用户目录( ...

  3. 第09组 Beta冲刺(3/4)

    队名:软工9组 组长博客:https://www.cnblogs.com/cmlei/ 作业博客:https://edu.cnblogs.com/campus/fzu/SoftwareEngineer ...

  4. arcgis python 获得硬件id

    import time import wmi, zlib def get_cpu_info(): tmpdict = {} tmpdict["CpuCores"] = 0 c = ...

  5. Java URLDecoder和URLEncoder对中文进行编码和解码

    URLDecoder类包含一个decode(String s,String enc)静态方法,它可以将application/x-www-form-urlencoded MIME字符串转成普通字符串: ...

  6. top中的wa的理解

    CPU使用率:参考 mpstat 手册,%usr + %nice + %sys + %iwoait + %irq + %soft + %steal + %guest + %gnice + %idle ...

  7. eclipse没有server选项怎么解决

    eclipse没有server选项怎么解决 步骤: 1,在eclipse菜单“Help”中选择“InstallNew Software”如下图所示. 2,然后在Work with中点击Add,如下图所 ...

  8. [LeetCode] 246. Strobogrammatic Number 对称数

    A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside ...

  9. 【电商日志项目之四】数据清洗-ETL

    环境 hadoop-2.6.5 首先要知道为什么要做数据清洗?通过各个渠道收集到的数据并不能直接用于下一步的分析,所以需要对这些数据进行缺失值清洗.格式内容清洗.逻辑错误清洗.非需求数据清洗.关联性验 ...

  10. 【Flume学习之二】Flume 使用场景

    环境 apache-flume-1.6.0 一.多agent连接 1.node101配置 option2 # Name the components on this agent a1.sources ...