HDU 5635 LCP Array(水~)

来源:互联网 发布:网络错误代码002 编辑:程序博客网 时间:2024/05/19 13:44

Description
一个由小写字母组成的长度为n的字符串,定义ai为该字符串第i个字符开始的后缀与第i+1个字符开始的后缀的最长公共前缀长度,现在给出a序列,问有多少种字符串与其对应(1<=i < n)
Input
第一行一整数T表示用例组数,每组用例首先输入字符串长度n,之后n-1个整数表示a序列(2<=n<=1e5,0<=ai < n)
Output
对于每组用例,输出合法字符串数量,结果模1e9+7
Sample Input
3
3
0 0
4
3 2 1
3
1 2
Sample Output
16250
26
0
Solution
显然a序列应该是一个连续下降的自然数序列直至变成0,之后全是0,以此来判是否有解,如果有解那么第一个字符有26种取值,对于其他字符,如果某字符与前一个字符不相同那么就有25种可能(相同只有1种可能,因为前一个字符已经固定,那么该字符也固定)
Code

#include<cstdio>#include<iostream>using namespace std;typedef long long ll;#define maxn 111111#define mod 1000000007llint T,n,a[maxn];ll ans;int main(){    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        for(int i=1;i<n;i++)scanf("%d",&a[i]);        ans=26;        int flag=1;        for(int i=1;i<n;i++)        {            if(!a[i])flag=0;            if(!flag)flag=1,ans=ans*25%mod;            if(a[i-1]!=0&&a[i]!=a[i-1]-1||a[i]>n-i)            {                ans=0;                break;            }        }         printf("%I64d\n",ans);    }    return 0;}
0 0
原创粉丝点击