[Codeforces291E]Tree-String Problem(hash+倍增)
来源:互联网 发布:tensorflow 关闭会话 编辑:程序博客网 时间:2024/06/07 00:58
题目描述
传送门
题解
可以将所有的字符串拆成一个一个的点,每一个点都只有一个字符
首先算出模式串的hash值
然后对于每一个点计算出从根到这个点形成的串的hash值
枚举每一个点,倍增求出与它的距离为模式串的长度的父亲,然后计算这一段的hash值
统计答案即可
代码
#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define UL unsigned long long#define N 300005#define sz 19const UL S=2000001001;int n,cnt,len,ans;char s[N];int tot,point[N],nxt[N],v[N];int c[N],f[N][sz+3];UL mi,model,hash[N];void add(int x,int y){ ++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y;}void build(int x,int fa){ hash[x]=hash[fa]*S+(UL)c[x]; for (int i=1;i<sz;++i) f[x][i]=f[f[x][i-1]][i-1]; for (int i=point[x];i;i=nxt[i]) { f[v[i]][0]=x; build(v[i],x); }}int find(int x,int k){ for (int i=0;i<sz;++i) if ((k>>i)&1) x=f[x][i]; return x;}void dfs(int x){ int fa=find(x,len); if (fa) { UL HASH=hash[x]-hash[fa]*mi; if (HASH==model) ++ans; } for (int i=point[x];i;i=nxt[i]) dfs(v[i]);}int main(){ scanf("%d",&n);c[1]='#';cnt=n; for (int i=2;i<=n;++i) { int fa;scanf("%d",&fa); scanf("%s",s);len=strlen(s); if (len>1) { c[++cnt]=s[0];add(fa,cnt); for (int j=1;j<len-1;++j) { ++cnt; add(cnt-1,cnt);c[cnt]=s[j]; } add(cnt,i),c[i]=s[len-1]; } else c[i]=s[0],add(fa,i); } scanf("%s",s);len=strlen(s); mi=1LL;for (int i=len-1;i>=0;--i) model+=(UL)s[i]*mi,mi*=S; n=cnt; build(1,0); dfs(1); printf("%d\n",ans);}
0 0
- [Codeforces291E]Tree-String Problem(hash+倍增)
- [codeforces291E]Tree-String Problem(hash+倍增)
- Hihocoder 挑战赛17 String Problem I (字符串HASH)
- PKU Campus 2011 B A Problem about Tree lca倍增
- codeforces 291 E. Tree-String Problem (dfs+kmp)
- p3763DNA,倍增+hash
- string (hash版)
- 【转载】string(hash)
- 【bzoj2085】[Poi2010]Hamsters hash+倍增
- HDU 5296 Annoying problem (树状数组+dfs序+倍增)
- ural 1750 Tree 2(树的直径 + 倍增)
- [Codeforces208E]Blood Cousins(dsu on the tree+倍增)
- [codeforces208E]Blood Cousins(dsu on the tree+倍增)
- HDU 4821 String(Hash)
- tju 4069 kai's problem (hash)
- FZU Problem 2280 Magic(Hash)
- [CF]291E. Tree-String Problem | dfs+kmp
- BZOJ 2085 Poi2010 Hamsters Hash+倍增Floyd
- MyBatis动态SQL标签用法
- leetcode-14. Longest Common Prefix
- 第一篇,开始记录Android一路走来
- AudioManager
- Java数组和链表的区别
- [Codeforces291E]Tree-String Problem(hash+倍增)
- zabbix 3.2 web界面中文显示
- 技术-技术方案优化策略--异步
- Python实战(二)—— urllib2 下载网页的方式总结
- 读写分离实现
- c# 最大公约数 最小公倍数
- SELinux初探
- Failed sending reply to debugger: Broken pipe
- 数据结构-红黑树(RBTree)