国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

codeforces 291 E. Tree-String Problem (dfs+kmp)

2019-11-06 06:34:25
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

E. Tree-String PRoblemtime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard output

A rooted tree is a non-directed connected graph without any cycles with a distinguished vertex, which is called the tree root. Consider the vertices of a rooted tree, that consists of n vertices, numbered from 1 to n. In this problem the tree root is the vertex number 1.

Let's represent the length of the shortest by the number of edges path in the tree between vertices v and u as d(v,?u).

A parent of vertex v in the rooted tree with the root in vertex r (v?≠?r) is vertex pv, such that d(r,?pv)?+?1?=?d(r,?v) and d(pv,?v)?=?1. For example, on the picture the parent of vertex v?=?5 is vertex p5?=?2.

One day Polycarpus came across a rooted tree, consisting of n vertices. The tree wasn't exactly ordinary: it had strings written on its edges. Polycarpus positioned the tree on the plane so as to make all edges lead from top to bottom if you go from the vertex parent to the vertex (see the picture). For any edge that lead from vertex pv to vertex v (1?<?v?≤?n), he knows string sv that is written on it. All strings are written on the edges from top to bottom. For example, on the picture s7="ba". The characters in the strings are numbered starting from 0.

An example of Polycarpus's tree (corresponds to the example from the statement)

Polycarpus defines the position in this tree as a specific letter on a specific string. The position is written as a pair of integers (v,?x) that means that the position is the x-th letter of the string sv (1?<?v?≤?n, 0?≤?x?<?|sv|), where |sv| is the length of string sv. For example, the highlighted letters are positions (2,?1) and (3,?1).

Let's consider the pair of positions (v,?x) and (u,?y) in Polycarpus' tree, such that the way from the first position to the second goes down on each step. We will consider that the pair of such positions defines string z. String z consists of all letters on the way from (v,?x) to(u,?y), written in the order of this path. For example, in the picture the highlighted positions define string "bacaba".

Polycarpus has a string t, he wants to know the number of pairs of positions that define string t. Note that the way from the first position to the second in the pair must go down everywhere. Help him with this challenging tree-string problem!

Input

The first line contains integer n (2?≤?n?≤?105) — the number of vertices of Polycarpus's tree. Next n?-?1 lines contain the tree edges. The i-th of them contains number pi?+?1 and string si?+?1 (1?≤?pi?+?1?≤?npi?+?1?≠?(i?+?1)). String si?+?1 is non-empty and consists of lowercase English letters. The last line contains string t. String t consists of lowercase English letters, its length is at least 2.

It is guaranteed that the input contains at most 3·105 English letters.

Output

Print a single integer — the required number.

Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64dspecifier.

Examplesinput
71 ab5 bacaba1 abacaba2 aca5 ba2 baabaoutput
6input
71 ab5 bacaba1 abacaba2 aca5 ba2 babacabaoutput
4Note

In the first test case string "aba" is determined by the pairs of positions: (2, 0) and (5, 0); (5, 2) and (6, 1); (5, 2) and (3, 1); (4, 0) and (4, 2); (4, 4) and (4, 6); (3, 3) and (3, 5).

Note that the string is not defined by the pair of positions (7, 1) and (5, 0), as the way between them doesn't always go down.

題解:dfs+kmp

這道題后來(lái)新加了數(shù)據(jù),不這道為什么找到的程序都紛紛TLE,我也華麗的TLE。

感覺就是對(duì)模式串建立kmp,一邊dfs一邊匹配。。

還望大神指點(diǎn)。

#include<iostream>#include<cstring>#include<cmath>#include<cstdio>#include<algorithm>#define N 500003using namespace std;int n,m,len,tot,v[N],nxt[N],point[N],t[N],r[N],l[N],sum;char s[N*10],ch[N*10];void add(int x,int y){	tot++; nxt[tot]=point[x]; point[x]=tot; v[tot]=y;}void build(){	len=strlen(s);	t[0]=-1;	for (int i=0;i<len;i++) {		int j=t[i];		while (j!=-1&&s[i]!=s[j]) j=t[j];		t[i+1]=++j;	}}void dfs(int x,int pre){	for (int i=point[x];i;i=nxt[i]){		int j=l[v[i]]; int k=pre; 		while (j<=r[v[i]]) {			if(k==-1||s[k]==ch[j])			 k++,j++;			else k=t[k];			if (k==len) sum++,k=t[k]; 		}		dfs(v[i],k);	}}int main(){	freopen("a.in","r",stdin);	scanf("%d",&n); int cnt=0;	for (int i=2;i<=n;i++) {		int x; scanf("%d%s",&x,s+1);		len=strlen(s+1);		for (int j=1;j<=len;j++) ch[++cnt]=s[j];		l[i]=r[i-1]+1; r[i]=cnt;		add(x,i);	}	scanf("%s",s);	build();	dfs(1,0);	printf("%d/n",sum);}


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 郸城县| 宣汉县| 成武县| 恭城| 陆丰市| 杂多县| 静乐县| 宽甸| 镇远县| 宁都县| 靖远县| 昌黎县| 海阳市| 汉川市| 营口市| 酒泉市| 东方市| 邢台市| 正蓝旗| 黄浦区| 祁连县| 镇雄县| 西宁市| 南木林县| 霍城县| 台中市| 玛纳斯县| 东兴市| 独山县| 金沙县| 闽清县| 长治市| 贡山| 平南县| 宜州市| 会泽县| 曲水县| 石楼县| 金山区| 孟村| 合阳县|