题目链接:hdoj 5635 LCP Array
定义字符串
s=s1...sn
的
suffix(i)=sisi+1si+2...sn.
题意:给定一个数组
a[i]=LCP(suffix(i),suffix(i+1)).
问你这样的串有多少个?字符串只存在小写字母.
思路:合法数组只存在 (0,0,0) 或者 (n,n−1,...,0) 这样的段。找到所有的段,一段段计算.
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#define CLR(a, b) memset(a, (b), sizeof(a))
using namespace std;
typedef long long LL;
const int MAXN = 1e5+10;
const int INF = 0x3f3f3f3f;
const double eps = 1e-4;
const int MOD = 1e9+7;
int a[MAXN];
int main()
{
int t; scanf("%d", &t);
while(t--)
{
int n; scanf("%d", &n);
bool flag = true;
for(int i = 1; i <= n-1; i++)
{
scanf("%d", &a[i]);
if(a[i] > n-i) flag = false;
}
int j = 1;
while(j <= n-1)
{
for(; j <= n-1; j++) if(a[j]) break;
j++;
for(; j <= n-1; j++)
{
if(a[j-1] - a[j] != 1) flag = false;
if(a[j] == 0) break;
}
j++;
}
LL ans = 1;
if(!flag) ans = 0;
else
{
a[n] = 0;
j = 1; ans = 26; bool zero = false, nozero = false;
if(a[j] == 0) zero = true;
if(a[j]) nozero = true;
while(j <= n)
{
for(; j <= n; j++)
{
if(a[j]) break;
if(zero) zero = !zero;
else ans = ans * 25 % MOD;
}
if(j > n) break;
for(; j <= n; j++)
if(a[j] == 0) break;
j++;
if(nozero) nozero = !nozero;
else ans = ans * 25 % MOD;
}
}
cout << ans << endl;
}
return 0;
}