测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A27936. 多样解码将一个由大写英文字母组成的字符串加密为一个数字串,可以简单地将 A ~ Z 转换为 0 ~ 25。但是这种方法带来的问题是,反向解码的结果可能是不唯一的。例如 `1213407` 既可以解码为 `BCBDEAH`,也可以解码为 `MBDEAH`、 `BCNEAH`、`BVDEAH` 或 `MNEAH`。注意 `07` 和 `7` 是有区别的,不能被解码为 `H`。本题就请你计算一下,给定…

填空题 较难

题目描述

多样解码

将一个由大写英文字母组成的字符串加密为一个数字串,可以简单地将 A ~ Z 转换为 0 ~ 25。但是这种方法带来的问题是,反向解码的结果可能是不唯一的。例如 `1213407` 既可以解码为 `BCBDEAH`,也可以解码为 `MBDEAH`、 `BCNEAH`、`BVDEAH` 或 `MNEAH`。注意 `07` 和 `7` 是有区别的,不能被解码为 `H`。

本题就请你计算一下,给定的数字串有多少种不同的解码结果。

输入

输入在一行中给出一个不超过 104 位的数字串,串非空且不包含空格。

输出

输出该数字串对应的不同解码结果的数量。这个数量可能非常巨大,你只需要输出其对 1000000007 取模后的结果。

样例输入

1213407

样例输出

5

参考答案

#include <iostream> #include <string> #include <vector> using namespace std; const int MOD = 1000000007; int main() { string s; cin >> s; int n = s.size(); vector<long long> dp(n + 1, 0); dp[0] = 1; // 空字符串有一种解码方式 for (int i = 1; i <= n; ++i) { // 单独处理当前字符,总是允许 dp[i] = dp[i-1]; // 处理两位的情况 if (i >= 2) { // 提取前两位字符并转换为整数 int two_digit = (s[i-2] - '0') * 10 + (s[i-1] - '0'); if (two_digit >= 10 && two_digit <= 25) { dp[i] += dp[i-2]; } } dp[i] %= MOD; } cout << dp[n] % MOD << endl; return 0; }
上一题 下一题