dp[i]表示在给定的密码中,第i位及第i位之前的密码段一共有几种组合
然后在从第i位开始遍历字典,更新dp[i+k]的值(k为字典中某个词的长度)
#include<iostream>
#include<map>
#include<cstring>
#include<string>
#include<vector>
using namespace std;
const int MAX = 10100;
char ch[27][5] = {
".-", "-...", "-.-.", "-..",
".", "..-.", "--.", "....",
"..", ".---", "-.-", ".-..",
"--", "-.", "---", ".--.",
"--.-", ".-.", "...", "-",
"..-", "...-", ".--", "-..-",
"-.--", "--.."
};
char str[MAX];
char dic[MAX][120];
char diclen[MAX];
int morselen[27];
int dp[MAX];
void solve(int n) {
int i, len, j, k;
bool ok;
len = strlen(&str[0]);
memset(dp, 0, sizeof(dp));
dp[0] = 1;
for (i = 1; i <= len; i++) {
for (j = 0; j < n; j++) {
ok = true;
for (k = 0; dic[j][k]; k++) {
if (dic[j][k] != str[i + k - 1]) {
ok = false;
break;
}
}
if (ok) dp[i - 1 + k] += dp[i - 1];
}
}
printf("%d\n", dp[len]);
}
int main() {
int t, n, i, j, len;
scanf("%d", &t);
while (t--) {
scanf("%s", &str[0]);
scanf("%d", &n);
for (i = 0; i < n; i++) {
char temp[25];
scanf("%s", &temp[0]);
len = 0;
for (j = 0; temp[j]; ++j) {
strcpy(&dic[i][len], ch[temp[j] - 'A']);
len += strlen(ch[temp[j] - 'A']);
}
dic[i][len] = '\0';
diclen[i] = len;
}
solve(n);
}
}