牛客小白月赛82 -- C题 --- 被遗忘的书籍 -- 题解

目录

 被遗忘的书籍 

题目描述

输入描述:

输出描述:

输入

输出

输入

输出

思路:

代码:


 被遗忘的书籍 

C-被遗忘的书籍_牛客小白月赛82 (nowcoder.com)
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

这里有一本包含 nnn 个小写英文字母的书籍,可惜的是书上的字体很模糊,并不知道具体的字符。但我们已经知道的是,这本书包含子串 "txt\tt txttxt"。

其中,子串是指字符串中连续的一段字符序列。

请求出这本书籍的内容的可能的种类数量。答案对 998244353998244353998244353 取模。

输入描述:

第一行包含一个整数 T(1≤T≤2⋅10^5),表示测试用例的组数。

对于每组测试用例:

仅输入一行,包含一个整数 n(1≤n≤2⋅10^5)

输出描述:

对于每组测试用例:
仅输出一行,包含一个整数,表示答案。

示例1

输入

3
2
3
4

输出

0
1
52

示例2

输入

3
199998
199999
200000

输出

866730100
551952279
943410719

思路:

在比赛的时候其实没有想到这是一道动态规划的题,刚开始想的是用容斥原理做,但是容斥太过复杂,因为又很多多算的情况,不好统计,然后就卡住了。

long[][] dp = new long[200005][3];
        long[] ans = new long[200005];
        dp[0][0] = 1;
        for (int i = 1; i <= 200000; i++) {
            // 已经构成答案的情况他的后面可以添加任意字母。
            ans[i] = (ans[i - 1] * 26 + dp[i - 1][2]) % mod;
            // dp[i][0] 表示第i位不为t, 并且 i-1位和i位不能构成tx
            dp[i][0] = (dp[i - 1][0] * 25L + dp[i - 1][1] * 24 + dp[i - 1][2] * 25) % mod;
            // dp[i][1]表示第i位为t, 并且 i-2位和i-1位和i位不能构成txt
            dp[i][1] = (dp[i - 1][0] + dp[i - 1][1]) % mod;
            //  dp[i][2] 表示第i-1位和第i位构成tx。
            dp[i][2] = dp[i - 1][1];
        }

代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Scanner;

/**
 * @ProjectName: study3
 * @FileName: Ex33
 * @author:HWJ
 * @Data: 2023/12/1 19:47
 */
public class Main {
    static long mod = 998244353;

    public static void main(String[] args) throws IOException {
        StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        in.nextToken();
        int t = (int) in.nval;
        long[][] dp = new long[200005][3];
        long[] ans = new long[200005];
        dp[0][0] = 1;
        for (int i = 1; i <= 200000; i++) {
            ans[i] = (ans[i - 1] * 26 + dp[i - 1][2]) % mod;
            dp[i][0] = (dp[i - 1][0] * 25L + dp[i - 1][1] * 24 + dp[i - 1][2] * 25) % mod;
            dp[i][1] = (dp[i - 1][0] + dp[i - 1][1]) % mod;
            dp[i][2] = dp[i - 1][1];
        }
        for (int o = 0; o < t; o++) {
            in.nextToken();
            int n = (int) in.nval;
            System.out.println(ans[n]);
        }
    }

}

 

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Studying~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值