1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
| const int maxn = 5, slen = 500; char str[slen]; int lim[maxn], n, LEN;
int tlen[maxn], l[maxn], sub[maxn][maxn];
int st[maxn]; bool check() { int vis[maxn]; memset(vis, 0, sizeof(vis)); vis[n-1] = 1, st[n-1] = 0;
for (int i = n-1; i >= 1; i--) { int p = st[i];
// p follow the substring of string i for (int j = 0; j < l[i]; j++) { int id = sub[i][j]; if (id == -1) p++; else { if (!vis[id]) { vis[id] = true; st[id] = p; } else { for (int d = 0; d < tlen[id]; d++) { if (str[p+d] != str[ st[id]+d ]) return false; } } p += tlen[id]; } } } return true; }
bool h(int cur, int maxll) { int t = maxll; for (int i = cur; i < n; i++) t *= lim[i]; if (t < LEN) return false; return true; }
bool dfs(int cur, int len, int k, int maxll) { if (h(cur, maxll) == false) return false;
if (cur == n) { // check valid return tlen[n-1] == LEN && check(); }
if (k && k == l[cur]) { // substr cur is finished, get tlen tlen[cur] = 0; for (int i = 0; i < l[cur]; i++) { int id = sub[cur][i]; tlen[cur] += (id == -1 ? 1 : tlen[id]); } return dfs(cur+1, 0, 0, max(maxll, tlen[cur])); }
if (len == 0) { // enumerate length of substr cur for (int i = lim[cur]; i >= 1; i--) { l[cur] = i; if (dfs(cur, i, 0, maxll)) return true; } } else { // enumerate sub(cur, k) for (int i = cur-1; i >= -1; i--) { sub[cur][k] = i; if (dfs(cur, len, k+1, maxll)) return true; } } return false; }
void init() { memset(tlen, 0, sizeof(tlen)); memset(l, 0, sizeof(l)); memset(sub, 0, sizeof(sub)); memset(st, 0, sizeof(st)); }
int main() { freopen("input.txt", "r", stdin); while (scanf("%d", &n) != EOF) { init();
// get data for (int i = n-1; i >= 0; i--) scanf("%d", &lim[i]); scanf("%s", str); LEN = strlen(str); reverse(str, str + LEN);
// then dfs int ans = dfs(0, 0, 0, 1); if (ans) printf("Yes\n"); else printf("No\n"); } }
|