BestCoder Round #74 (div.2) LCP Array

真是TMD,bestcoder 73 竟然做了一天

LCP Array   

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)

Total Submission(s): 1087    Accepted Submission(s): 306

Problem Description

Peter has a string s=s1s2...sn, let suffi=sisi+1...sn be the suffix start with i-th character of s. Peter knows the lcp (longest common prefix) of each two adjacent suffixes which denotes as ai=lcp(suffi,suffi+1)(1≤i<n).

Given the lcp array, Peter wants to know how many strings containing lowercase English letters only will satisfy the lcp array. The answer may be too large, just print it modulo 109+7.

 

Input

There are multiple test cases. The first line of input contains an integer T indicating the number of test cases. For each test case:

The first line contains an integer n (2≤n≤105) -- the length of the string. The second line contains n−1 integers: a1,a2,...,an−1 (0≤ai≤n).

The sum of values of n in all test cases doesn't exceed 106.

 

Output

For each test case output one integer denoting the answer. The answer must be printed modulo 109+7.

 

Sample Input

3

3

0 0

4

3 2 1

3

1 2

 

Sample Output

16250

26

0







假设对于字符串

a1 a2 a3 a4 a5 a6 a7 a8 a9

第2位的后缀即

a2 a3 a4 a5 a6 a7 a8 a9

和第3位的后缀即

   a3 a4 a5 a6 a7 a8 a9

最长公共前缀长度为3,那么a2=a3,a3=a4,a4=a5;

即a2=a3=a4=a5

规律显而易见

对于字符串

aaafffgggggtre我们写出其给定的数组

2102104321000

观察到

1.如果第i位和第i+1位不同,则arr[i]=0

2.若arr[i]!=0,则第i到i+arr[i]位相同

所以简单起见,可以这样判断:每当读入一个数

1.和上一位比较,如果(差不是1并且上一位不是0) ,则不合法,输出0,结束

2.判断是否为0,如果是0,计数器+1;

最后,通过排列组合知识,

第1位可以选26个字母,以后各位可以选和前一位不同的25个字母,计算答案即可,注意用longlong,边算边模

代码很简单,博主的代码丢了。。。诶呀,linux就是这样,新建很麻烦,所以每次都覆盖了,不过核心代码只有不过10行,大家自己写吧!

为了给抄代码的同学提供方便,大家可以去我同学DERIT的博客抄   http://blog.csdn.net/deritt/article/details/50822077

祝大家母亲节快乐





你可能感兴趣的:(编程,C++,NOI)