目录
被遗忘的书籍
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]);
}
}
}