LCP Array
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 895 Accepted Submission(s): 252
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.
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.
3 3 0 0 4 3 2 1 3 1 2
16250 26 0
首先每一个元素都限制在a[i] <= n - i, 若有超出限制的直接跳出输出0
发现规律a[i] != 0时a[i + 1] = a[i] - 1,若符合执行下一步,否则跳出,然后输出0
发现规律,有x个0,最后结果就是26 * 25^x
注意取模运算
#include <cstdio>
#include <iostream>
using namespace std;
int a[100005];
long long mod = 1000000007;
long long p(long long x) {
long long res = 1;
for (int i = 1; i <= x; i++) {
res = (res * 25) % mod;
}
return res;
}
int main()
{
int T, n;
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
bool flag = true;
int cou = 0;
for (int i = 1; i <= n - 1; i++) {
scanf("%d", &a[i]);
if (!a[i]) cou++;
if (a[i] > n - i) flag = false;
}
if (!flag) {
puts("0");
continue;
}
for (int i = 1; i <= n - 2; i++) {
if (a[i] != 0 && a[i + 1] != a[i] - 1) {
flag = false;
break;
}
}
if (flag) {
printf("%I64d\n", (26 * p(cou)) % mod);
}
else {
puts("0");
}
}
return 0;
}
526



被折叠的 条评论
为什么被折叠?



