传送门

经典的点分治,hash判断字符串的前缀和后缀;

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define rep(i,a,b) for(int i=a;i<=b;++i)
 4 #define fgr(i,u) for(int i=head[u];i;i=to[i])
 5 typedef long long ll;
 6 typedef unsigned long long ull;
 7 const int maxn=1000010,inf=0x3f3f3f3f;
 8 ll ans;
 9 inline int gi() {
10     int x=0; char o; bool f=true; for(;!isdigit(o=getchar());)if(o=='-') f=false;
11     for(;isdigit(o);o=getchar()) x=(x<<1)+(x<<3)+(o&15); return f?x:~x+1;
12 }
13 template <class T> bool check_Max(T &x, const T &y) {
14     if( x < y) { x = y; return false; } return true;
15 }
16 template <class T> bool check_Min(T &x, const T &y) {
17     if( x > y) { x = y; return false; } return true;
18 }
19 int v[maxn<<1],to[maxn<<1],head[maxn],p;
20 inline void link(int a,int b) { v[++p]=b; to[p]=head[a]; head[a]=p;}
21 int rt,_Max,sigma,vis[maxn],sz[maxn];
22 inline void grt(int u,int pre) {//重心------------
23     sz[u]=1;int Mx=0;
24     fgr(i,u) if(v[i]^pre&&!vis[v[i]])
25         grt(v[i],u),sz[u]+=sz[v[i]],check_Max(Mx,sz[v[i]]);
26     check_Max(Mx,sigma-sz[u]);
27     if(!check_Min(_Max,Mx)) rt=u;
28 }
29 char S[maxn],T[maxn];
30 int Len;
31 const ull base=19260817;//--------------hash
32 ull h1[maxn],h2[maxn],bis[maxn];//------hash
33 ll F[maxn],G[maxn],sf[maxn],sg[maxn];
34 int dfs(int u,int pre,int dep,ull hs) {
35     sz[u]=1; hs=hs*base+T[u]; int tmp=1;
36     if(hs==h1[dep]) F[(dep-1)%Len+1]++, ans+=sg[Len-(dep-1)%Len];
37     if(hs==h2[dep]) G[(dep-1)%Len+1]++, ans+=sf[Len-(dep-1)%Len];
38     fgr(i,u) if(v[i]^pre&&!vis[v[i]])
39         check_Max(tmp,dfs(v[i],u,dep+1,hs)+1),sz[u]+=sz[v[i]];
40     return tmp;
41 }
42 inline void solve(int u) {
43     vis[u]=1; sg[1]=sf[1]=1;
44     int tmp=0,K=0;
45 //    printf("%d %d - \n",u,ans);// de bug
46     fgr(i,u) if(!vis[v[i]]) {
47         K=min(Len,dfs(v[i],u,2,T[u])+1); check_Max(tmp,K);
48         rep(k,1,K) sf[k]+=F[k],sg[k]+=G[k],F[k]=G[k]=0;
49     }
50     rep(i,1,tmp) sf[i]=sg[i]=0;
51     fgr(i,u) if(!vis[v[i]])
52         rt=v[i],sigma=sz[v[i]],_Max=inf,grt(v[i],u),solve(rt);
53 }
54 int Tim,n;
55 int main() {
56 #ifndef ONLINE_JUDGE
57     freopen("1a.in","r",stdin);
58 #endif
59     for(Tim=gi();Tim;--Tim) {
60         memset(head,0,sizeof(head)); memset(vis,0,sizeof(vis)); p=0;
61         ans=0;
62         n=gi(); Len=gi(); scanf("%s",T+1);
63         rep(i,2,n) {int u=gi(),v=gi();link(u,v);link(v,u);}
64         scanf("%s",S+1);
65         bis[0]=1;h1[0]=h2[0]=0;
66         rep(i,1,n) {bis[i]=bis[i-1]*base; h1[i]=h1[i-1]+bis[i-1]*S[(i-1)%Len+1]; h2[i]=h2[i-1]+bis[i-1]*S[Len-(i-1)%Len];}
67         rt=1; sigma=n; _Max=inf; grt(1,0); solve(rt);
68         printf("%lld\n",ans);
69     }
70     return 0;
71 }


转载于:https://www.cnblogs.com/miecoku/p/9772099.html

[BZOJ 4598][Sdoi2016]模式字符串相关推荐

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

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

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

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

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

    4598: [Sdoi2016]模式字符串 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 80  Solved: 37 [Submit][Statu ...

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

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

  5. BZOJ4598: [Sdoi2016]模式字符串

    BZOJ4598 求树上满足某些条件的点对,首先就可以想到点分治. 然后又与什么字符串匹配有关.KMP,AC自动机--KMP,AC自动机--之类的好像不太好用..那就哈希吧! 添加答案的时候有两种情况 ...

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

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

  7. bzoj4598 [Sdoi2016]模式字符串 hash+点分

    哈希也是有技巧的.不然很容易错. 匹配串范围是1e6的,所以普通hash错误概率也是很大的 所以就要利用匹配的特性(长度与匹配串一一对应)来hash,这样错误概率会小,相当于hash挂链吧. 一开始写 ...

  8. pandas使用replace函数和正则表达式移除dataframe字符串数据列中头部指定模式字符串(Removing leading substring in dataframe)

    pandas使用replace函数和正则表达式移除dataframe字符串数据列中头部指定模式字符串(Removing leading substring in dataframe) 目录

  9. pandas使用replace函数和正则表达式移除dataframe字符串数据列中尾部指定模式字符串(Removing trailing substring in dataframe)

    pandas使用replace函数和正则表达式移除dataframe字符串数据列中尾部指定模式字符串(Removing trailing substring in dataframe) 目录

最新文章

  1. ios技术篇-CoreData
  2. Linux 实时流量监测(iptraf中文图解)
  3. 第一阶段用户模板和场景
  4. C++的Json解析库:jsoncpp和boost
  5. java附加属性_Java 9附加流
  6. Java跟踪对象,使用OpenCV实时隔离和跟踪多个对象?
  7. 多拉A梦——日语歌词
  8. Python刷题-4
  9. jquery on()动态绑定元素的的点击事件无反应的问题记录
  10. java创建内部面板类_java-RGB调色面板的实现(事件监听器之匿名内部类)
  11. 和10位CIO,聊了聊他们今年的OKR
  12. 如何格式化写保护的U盘(删除多个盘的U盘)
  13. 巴菲特致股东的一封信:2000年
  14. Android Audio架构
  15. 插件化框架集成-360插件框架DroidPlug
  16. 龚文祥自爆今日头条微博自媒体年收入仅1000元!
  17. 网站优化推广怎么做?
  18. Ubuntu和Windows双系统服务器互相切换的简单方案
  19. 如何进行期货日内趋势量化交易系统的设计?这篇文章可以给你启发!
  20. 数据安全的下一个风口:SASE云服务平台

热门文章

  1. 聊聊CentOS停止维护,要我说这是件大好事!
  2. Web安全基础一漏洞产生原理漏洞探测(持续更新)
  3. 专治选择困难症:Mate 10 Pro和P20 Pro之间如何选?
  4. python实现淘宝毫秒级秒杀 自动付款
  5. MyBatis中的多条件查询
  6. 命令式和声明式,哪个才是你的菜
  7. 各版本 DOTween 下载地址
  8. Origin图表导出png文件和pdf文件的方法
  9. 优化了的过关键点的光滑曲线拟合算法
  10. 虚拟服务器ip怎么配,如何向虚拟服务器分配端口和 IP 地址