4
int findGoodStrings(int n, string s1, string s2, string evil) {10
for (int i = 1, j = 0; i < m; ++i) {11
while (j != 0 && evil[i] != evil[j]) {14
if (evil[i] == evil[j]) {19
// next(i,c) jump function when matched i length and see c21
for (int i = 0; i <= m; ++i) {22
for (int j = 0; j < 26; ++j) {23
if (i < m && evil[i] == 'a' + j) {26
next[i][j] = i == 0 ? 0 : next[f[i - 1]][j];30
// dp(i,j,l1,l2) length i greater than s1, less than s2;31
// match j length of evil32
// l1 true means limited for s1, l2 true means limited for s233
ll dp[n + 1][m + 1][2][2];34
memset(dp, 0, sizeof(dp));36
for (int i = 0; i < n; ++i) {37
for (int j = 0; j < m; ++j) {38
for (int c = 0; c < 26; ++c) {41
dp[i + 1][k][0][0] += dp[i][j][0][0];43
if (ch > s1[i] && ch < s2[i]) {44
dp[i + 1][k][0][0] += dp[i][j][1][1];45
} else if (ch == s1[i] && ch == s2[i]) {46
dp[i + 1][k][1][1] += dp[i][j][1][1];47
} else if (ch == s1[i]) {48
dp[i + 1][k][1][0] += dp[i][j][1][1];49
} else if (ch == s2[i]) {50
dp[i + 1][k][0][1] += dp[i][j][1][1];55
dp[i + 1][k][0][0] += dp[i][j][1][0];56
} else if (ch == s1[i]) {57
dp[i + 1][k][1][0] += dp[i][j][1][0];62
dp[i + 1][k][0][0] += dp[i][j][0][1];63
} else if (ch == s2[i]) {64
dp[i + 1][k][0][1] += dp[i][j][0][1];67
dp[i + 1][k][0][0] %= M;72
for (int i = 0; i < m; ++i) {73
ans += dp[n][i][0][0] + dp[n][i][0][1] + dp[n][i][1][0];