CF 291E. Tree-String Problem [dfs kmp trie图优化]
[CF291E](http://codeforces.com/contest/291/problem/E)
题意:一棵树,每条边上有一些字符,求目标串出现了多少次
直接求目标串的fail然后一边dfs一边跑kmp
然后就被特殊数据卡到\(O(n^2)\)了...
因为这样kmp复杂度分析的基础就没有了,now指针可能每个孩子都减少n次
所以怒加trie图优化
貌似有人写了倍增+哈希的做法........
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
#define MP make_pair
#define fir first
#define sec second
const int N=5e5+5, M=5e5+5;
int read(){
char c=getchar();int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}
return x*f;
}
int n, x, f[M], len, t[M][27];
char ch[M], str[M];
struct edge{int v, ne; string s;}e[N];
int cnt, h[N];
inline void ins(int u, int v) {
e[++cnt]=(edge){v, h[u], string(ch)}; h[u]=cnt;
}
int ans=0;
void dfs(int u, int p) {
for(int i=h[u];i;i=e[i].ne) {
int now = p, v = e[i].v;
string &s = e[i].s;
for(int i=0; i<(int)s.size(); i++) {
now = t[now][s[i]-'a'];
if(now == len) ans++, now = f[now];
}
dfs(v, now);
}
}
int main() {
//freopen("in","r",stdin);
n=read();
for(int i=2; i<=n; i++) x=read(), scanf("%s",ch), ins(x, i);
scanf("%s",str+1); len=strlen(str+1);
f[1]=0; int now=0;
for(int i=2; i<=len; i++) {
now = f[i-1];
while(now && str[now+1] != str[i]) now = f[now];
f[i] = str[now+1] == str[i] ? now+1 : 0;
}
for(int i=0; i<len; i++)
for(int j=0; j<26; j++)
t[i][j] = str[i+1]-'a' == j ? i+1 : t[f[i]][j];
dfs(1, 0);
cout << ans;
}
CF 291E. Tree-String Problem [dfs kmp trie图优化]的更多相关文章
- HDU 3374 String Problem (KMP+最大最小表示)
HDU 3374 String Problem (KMP+最大最小表示) String Problem Time Limit: 2000/1000 MS (Java/Others) Memory ...
- HDU 3374 String Problem(KMP+最大/最小表示)
String Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- HDOJ3374 String Problem 【KMP】+【最小表示法】
String Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- [HIHO1260]String Problem I(trie树)
题目链接:http://hihocoder.com/problemset/problem/1260 n个字符串,m次询问.每次询问给一个字符串,问这个字符串仅可以在一个地方加一个字母.这样操作后与n个 ...
- String Problem --- hdu3374(kmp、字典序最大与最小)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374 题意很简单,输出的是最小字典序的编号,最小字典序个数,最大字典序编号,最大字典序个数. 可以想一 ...
- HDU 3374 String Problem (KMP+最小最大表示)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3374 [题目大意] 给出一个字符串,求出最小和最大表示是从哪一位开始的,并且输出数量. [题解] ...
- hdu 3374 String Problem (kmp+最大最小表示法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374 题目大意:输出最大和最小的是从哪一位开始的,同时输出最小循环节的个数. 这里简单介绍对字符串最小 ...
- HDU - 3374 String Problem (kmp求循环节+最大最小表示法)
做一个高产的菜鸡 传送门:HDU - 3374 题意:多组输入,给你一个字符串,求它最小和最大表示法出现的位置和次数. 题解:刚刚学会最大最小表示法,amazing.. 次数就是最小循环节循环的次数. ...
- HDU5772 String problem 最大权闭合图+巧妙建图
题意:自己看吧(不是很好说) 分析: 网络流:最大权闭合子图. 思路如下: 首先将点分为3类 第一类:Pij 表示第i个点和第j个点组合的点,那么Pij的权值等于w[i][j]+w[j][i](表示得 ...
随机推荐
- 2017广东工业大学程序设竞赛B题占点游戏
Description 众所周知的是,TMK特别容易迟到,终于在TMK某次又迟到了之后,Maple怒了,Maple大喊一声:"我要跟你决一死战!"然后Maple就跟TMK玩起了一个 ...
- A. Two Bases
A. Two Bases time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- android手机安全卫士、Kotlin漫画、支付宝动画、沉浸状态栏等源码
Android精选源码 轻量级底部导航栏 android手机卫士源码 android实现高仿今日头条源码 一个用Kotlin写的简单漫画App源码 android吐槽项目完整源码 ...
- Proxy 那点事儿
---恢复内容开始--- 尊重原创:https://my.oschina.net/huangyong/blog/159788 Proxy,也就是"代理"了.意思就是,你不用去做,别 ...
- 多文件中的static
这里借鉴一篇文章:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html#undefined 在这里举个例子,先和你说说 ...
- Python下载、环境变量配置、 模块安装方法
下载 Windows版官网下载地址:https://www.python.org/downloads/windows/ 类似下图以 installer结尾的文件就是我们需要下载的,位数根据自己的电脑进 ...
- windows平台下python 打包成exe可执行文件
第一步 安装 pyinstaller 命令行下运行:pip install pyinstaller 第二步 打包安装 pyinstaller Test.py 第三步 完成 找到打包目录下dist目录 ...
- phpstudy本地搭建域名访问
http://blog.csdn.net/camillezj/article/details/54694554 步骤如下: 一.hosts配置: 1.用编辑器打开hosts文件,位置:C:\Windo ...
- apple watch 与 iphone 之间的通信方式
apple watch 与 iphone 之间的通信方式:通过watchkit WatchKit应用扩展都提供一个名为WKInterfaceController的子类来管理相应的界面. 启动watch ...
- iphone开发笔记目录
http://www.cnblogs.com/syxchina/archive/2012/10/20/2732731.html#2653802