hdoj 5635 LCP Array 【模拟】

本文针对HDOJ5635 LCPArray题目进行了解析,给出了AC代码实现,并详细阐述了如何通过判断数组特征来确定可能存在的字符串。该方法适用于仅包含小写字母的字符串,且利用特定的数组性质来计算可能的字符串数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接: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,n1,...,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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值