写了个很简单的插头dp,可是不管怎么改都会WA掉#5#6#10拿70分,改了一个下午了,求求看到的的各位大佬帮帮忙。
WA code:
#include <bits/stdc++.h>
using namespace std;
const int M = 10;
const int offset = 3, mask = (1 << offset) - 1;
int n, m;
long long ans, d;
const int MaxSZ = 16796, Prime = 9973;
struct hashTable {
int head[Prime], next[MaxSZ], sz;
int state[MaxSZ];
long long key[MaxSZ];
void clear() {
sz = 0;
memset(head, -1, sizeof(head));
}
void push(int s) {
int x = s % Prime;
for (int i = head[x]; ~i; i = next[i]) {
if (state[i] == s) {
key[i] += d;
return;
}
}
state[sz] = s, key[sz] = d;
next[sz] = head[x];
head[x] = sz++;
}
void roll() {
for (int i = 0; i < sz; i++) state[i] <<= offset;
}
} H[2], *H0, *H1;
int b[M + 1], bb[M + 1];
int encode() {
int s = 0;
memset(bb, -1, sizeof(bb));
int bn = 1;
bb[0] = 0;
for (int i = m; i >= 0; --i) {
if (!~bb[b[i]]) bb[b[i]] = bn++;
s <<= offset;
s |= bb[b[i]];
}
return s;
}
void decode(int s) {
for (int i = 0; i < m + 1; i++) {
b[i] = s & mask;
s >>= offset;
}
}
void push(int j, int dn, int rt) {
b[j] = dn;
b[j + 1] = rt;
H1->push(encode());
}
int main() {
int a1, a2;
cin >> a1 >> a2;
n = 2; m = 2;
if (m > n) swap(n, m);
H0 = H, H1 = H + 1;
H1->clear();
d = 1;
H1->push(0);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
swap(H0, H1);
H1->clear();
for (int ii = 0; ii < (H0->sz); ii++) {
decode(H0->state[ii]);
d = H0->key[ii];
int lt = b[j], up = b[j + 1];
bool dn = i != n - 1, rt = j != m - 1;
if (lt && up) {
if (lt == up) {
if (i == n - 1 && j == m - 1) {
push(j, 0, 0);
}
} else {
for (int i = 0; i < m + 1; i++)
if (b[i] == lt) b[i] = up;
push(j, 0, 0);
}
} else if (lt || up) {
int t = lt | up;
if (dn) {
push(j, t, 0);
}
if (rt) {
push(j, 0, t);
}
} else {
if (dn && rt) {
push(j, m, m);
}
}
}
}
H1->roll();
}
assert(H1->sz <= 1);
int ans1 = (H1->sz == 1 ? H1->key[0] : 0);
n = 2; m = 2;
if (m > n) swap(n, m);
H0 = H, H1 = H + 1;
H1->clear();
d = 1;
H1->push(0);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
swap(H0, H1);
H1->clear();
for (int ii = 0; ii < (H0->sz); ii++) {
decode(H0->state[ii]);
d = H0->key[ii];
int lt = b[j], up = b[j + 1];
bool dn = i != n - 1, rt = j != m - 1;
if (lt && up) {
if (lt == up) {
if (i == n - 1 && j == m - 1) {
push(j, 0, 0);
}
} else {
for (int i = 0; i < m + 1; i++)
if (b[i] == lt) b[i] = up;
push(j, 0, 0);
}
} else if (lt || up) {
int t = lt | up;
if (dn) {
push(j, t, 0);
}
if (rt) {
push(j, 0, t);
}
} else {
if (dn && rt) {
push(j, m, m);
}
}
}
}
H1->roll();
}
assert(H1->sz <= 1);
int ans2 = (H1->sz == 1 ? H1->key[0] : 0);
cout << ans1 * a1 + ans2 * a2;
}