Skip to content

Commit 19ddefc

Browse files
authored
Create number-of-strings-which-can-be-rearranged-to-contain-substring.cpp
1 parent 810a285 commit 19ddefc

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// Time: O(logn)
2+
// Space: O(1)
3+
4+
// combinatorics, principle of inclusion-exclusion
5+
class Solution {
6+
public:
7+
int stringCount(int n) {
8+
static const int MOD = 1e9 + 7;
9+
const auto& powmod = [](uint64_t a, uint64_t b, uint64_t mod) {
10+
a %= mod;
11+
int64_t result = 1;
12+
while (b) {
13+
if (b & 1) {
14+
result = (result * a % mod);
15+
}
16+
a = (a * a % mod);
17+
b >>= 1;
18+
}
19+
return result;
20+
};
21+
22+
return ((powmod(26, n, MOD) -
23+
(25 + 25 + 25 + n) * powmod(25, n - 1, MOD) + // no l, t, e, ee
24+
(24 + 24 + 24 + n + n + 0) * powmod(24, n - 1, MOD) - // no l|t, l|e, t|e, l|ee, t|ee, e|ee
25+
(23 + n + 0 + 0) * powmod(23, n - 1, MOD)) % MOD + MOD) % MOD; // no l|t|e, l|t|ee, l|e|ee, t|e|ee
26+
}
27+
};
28+
29+
// Time: O(2^4 * n) = O(n)
30+
// Space: O(2^4) = O(1)
31+
// bitmasks, dp
32+
class Solution2 {
33+
public:
34+
int stringCount(int n) {
35+
static const int MOD = 1e9 + 7;
36+
37+
enum {L = 1 << 0, E = 1 << 1, EE = 1 << 2, T = 1 << 3};
38+
vector<int64_t> dp(1 << 4);
39+
dp[0] = 1;
40+
for (int _ = 0; _ < n; ++_) {
41+
vector<int64_t> new_dp(1 << 4);
42+
for (int mask = 0; mask < size(dp); ++mask) {
43+
new_dp[mask | L] = (new_dp[mask | L] + dp[mask]) % MOD;
44+
if ((mask & E) == 0) {
45+
new_dp[mask | E] = (new_dp[mask|E] + dp[mask]) % MOD;
46+
} else {
47+
new_dp[mask | EE] = (new_dp[mask | EE] + dp[mask]) % MOD;
48+
}
49+
new_dp[mask | T] = (new_dp[mask | T] + dp[mask]) % MOD;
50+
new_dp[mask] = (new_dp[mask] + 23 * dp[mask]) % MOD;
51+
}
52+
dp = move(new_dp);
53+
}
54+
return dp.back();
55+
}
56+
};

0 commit comments

Comments
 (0)