[BZOJ 4598][Sdoi2016]模式字符串
传送门
经典的点分治,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]模式字符串相关推荐
- bzoj 4598: [Sdoi2016]模式字符串
题目描述 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m的模式串s,其中每一位仍然是A到z的大写字母. Alice希望知道,有多少对结点&l ...
- BZOJ.4598.[SDOI2016]模式字符串(点分治 Hash)
LOJ BZOJ 洛谷 点分治.考虑如何计算过\(rt\)的答案. 记\(pre[i]\)表示(之前的)子树内循环匹配了\(S\)的前缀\(i\)的路径有多少,\(suf[i]\)表示(之前的)子树内 ...
- 4598: [Sdoi2016]模式字符串
4598: [Sdoi2016]模式字符串 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 80 Solved: 37 [Submit][Statu ...
- 【BZOJ4598】[Sdoi2016]模式字符串 树分治+hash
[BZOJ4598][Sdoi2016]模式字符串 Description 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m的模式串s,其中每 ...
- BZOJ4598: [Sdoi2016]模式字符串
BZOJ4598 求树上满足某些条件的点对,首先就可以想到点分治. 然后又与什么字符串匹配有关.KMP,AC自动机--KMP,AC自动机--之类的好像不太好用..那就哈希吧! 添加答案的时候有两种情况 ...
- Bzoj4598: [Sdoi2016]模式字符串 点分治 哈希
国际惯例的题面: 这种关于树上路径的题,我也没什么好办法,只好点分治. 考虑当前分治重心为root,如何统计经过分治重心的路径的答案. 我们令prf[i]表示某个点到root的路径(不含root)已经 ...
- bzoj4598 [Sdoi2016]模式字符串 hash+点分
哈希也是有技巧的.不然很容易错. 匹配串范围是1e6的,所以普通hash错误概率也是很大的 所以就要利用匹配的特性(长度与匹配串一一对应)来hash,这样错误概率会小,相当于hash挂链吧. 一开始写 ...
- pandas使用replace函数和正则表达式移除dataframe字符串数据列中头部指定模式字符串(Removing leading substring in dataframe)
pandas使用replace函数和正则表达式移除dataframe字符串数据列中头部指定模式字符串(Removing leading substring in dataframe) 目录
- pandas使用replace函数和正则表达式移除dataframe字符串数据列中尾部指定模式字符串(Removing trailing substring in dataframe)
pandas使用replace函数和正则表达式移除dataframe字符串数据列中尾部指定模式字符串(Removing trailing substring in dataframe) 目录
最新文章
- ios技术篇-CoreData
- Linux 实时流量监测(iptraf中文图解)
- 第一阶段用户模板和场景
- C++的Json解析库:jsoncpp和boost
- java附加属性_Java 9附加流
- Java跟踪对象,使用OpenCV实时隔离和跟踪多个对象?
- 多拉A梦——日语歌词
- Python刷题-4
- jquery on()动态绑定元素的的点击事件无反应的问题记录
- java创建内部面板类_java-RGB调色面板的实现(事件监听器之匿名内部类)
- 和10位CIO,聊了聊他们今年的OKR
- 如何格式化写保护的U盘(删除多个盘的U盘)
- 巴菲特致股东的一封信:2000年
- Android Audio架构
- 插件化框架集成-360插件框架DroidPlug
- 龚文祥自爆今日头条微博自媒体年收入仅1000元!
- 网站优化推广怎么做?
- Ubuntu和Windows双系统服务器互相切换的简单方案
- 如何进行期货日内趋势量化交易系统的设计?这篇文章可以给你启发!
- 数据安全的下一个风口:SASE云服务平台