60 lines
1.5 KiB
C++
60 lines
1.5 KiB
C++
#include <bits/stdc++.h>
|
|
|
|
typedef long long ll;
|
|
using namespace std;
|
|
|
|
const int MOD = 1e9 + 7;
|
|
|
|
ll numDecodings(string s)
|
|
{
|
|
if (s[0] == '0')
|
|
return 0;
|
|
for (int i = 1; i < s.size(); i++)
|
|
{
|
|
if (s[i] == '0' && s[i - 1] == '0')
|
|
return 0;
|
|
}
|
|
|
|
// each letter can be a part of the message on their on
|
|
// they can extend the last letter to also form another part of the mesage
|
|
// let dp[i][{0, 1}] be the number of different messages ending at the i(th) char when the i(th) char
|
|
// is not concatenated with i-1(th) char or is.
|
|
|
|
// if s[i] is between 1 and 26 then it can be added alone, so dp[i][0] = dp[i - 1][0] + dp[i - 1][1]
|
|
// if s[i] concatenated with s[i - 1] and is between 1 and 26 then they can be added togheter, dp[i][1] = dp[i - 2][0] + dp[i - 2][1]
|
|
|
|
// dp[1][0] = 1, dp[1][1] = 0
|
|
|
|
int N = s.size();
|
|
vector<vector<ll>> dp(N + 1, vector<ll>(2, 0));
|
|
dp[1][0] = 1, dp[1][1] = 0;
|
|
dp[0][0] = 1;
|
|
for (int i = 2; i <= N; i++)
|
|
{
|
|
char current = s[i - 1], last = s[i - 2];
|
|
string aux = "";
|
|
aux += last;
|
|
aux += current;
|
|
if (current != '0')
|
|
{
|
|
dp[i][0] = dp[i - 1][0] + dp[i - 1][1];
|
|
dp[i][0] %= MOD;
|
|
}
|
|
|
|
int code = stoi(aux);
|
|
if (10 <= code && code <= 26)
|
|
{
|
|
dp[i][1] = dp[i - 2][0] + dp[i - 2][1];
|
|
dp[i][1] %= MOD;
|
|
}
|
|
}
|
|
return (dp[N][0] + dp[N][1]) % MOD;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
int n; cin >> n;
|
|
string code; cin >> code;
|
|
cout << numDecodings(code) << endl;
|
|
return 0;
|
|
} |