Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 1827 Accepted Submission(s): 588 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 ). 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: 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 Source Recommend wange2014 |
题目大意:其实感觉这个题目主要就是把题目弄明白,当时就是没看懂题目是啥,
给你一个长度为N的字符串,给你前N-1个位置的a[i],这个a[i]就是表示一个字符串以第i位开头的后缀与以第i+1位为开头的后缀的最长公共前缀的长度,其实我感觉就是整个N长度的字符串都是一个字母,比如是A,就是如果当前有一个a[i]为0,那么就是当前的这个字母不是A,而是其他的,问你这种字符串的数量有多少个
思路:就像上面说的,比如这个字母是A,那么这个A就有26种,‘a’~‘z’随意一个,然后后面说的不是A的就有25种,因为26-1嘛,写出来就好了,还是好好读题吧,
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int mod=1000000007;
const int maxn=100050;
int n;
int a[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1; i<=n-1; i++)
{
scanf("%d",&a[i]);
}
long long ans=26;
for(int i=1; i<=n-1; i++)
{
if(a[i-1]!=0&&a[i]!=a[i-1]-1)
{
ans=0;
break;
}
if(a[i]==0)
{
ans=(ans*25)%mod;
}
}
if(a[n-1]>1)
{
cout<<0<<endl;
continue;
}
cout<<ans<<endl;
}
}