line 86
先判断一下 m * n / k 是否是 S / 2 的形式
皮克定理
$A=I+\frac{B}{2} −1$
Mysterious Crime
哈希一下,然后二分
BIA
支!配!树!
是一道比较有意思的DP,由于可以取大于4的前缀,所以对于一个词缀来说,它先天就可以作为一个词缀,限制它的是后面的是否成立,会影响当前词缀,所以倒着DP
已经知道它是DP后还是比较好想的,分情况讨论,然后看这个词缀是否能取,dp表示这个词缀是否能取。就是写的时候费了一些时间
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
string s;
cin >> s;
int n = s.size();
s = ' ' + s;
set<string> st;
vector<array<int, 2>> dp(n + 1);
auto check = [&](int i, int len) {
if (i - len < 5) return false;
string str = "";
for (int j = 1; j <= len; j ++) str += s[i - len + j];
if (i == n) {
st.insert(str);
return true;
}
int t = len & 1;
if (i + (len ^ 1) <= n && dp[i + (len ^ 1)][t ^ 1]) {
st.insert(str);
return true;
}
if (i + len > n || !dp[i + len][t]) return false;
bool same = true;
for (int j = 1; j <= len; j ++) {
if (s[i - len + j] != s[i + j]) {
same = false;
}
}
if (same) return false;
st.insert(str);
return true;
};
for (int i = n; i >= 7; i --) {
if (check(i, 2)) dp[i][0] = true;
if (check(i, 3)) dp[i][1] = true;
}
cout << st.size() << endl;
for (auto &i : st) {
cout << i << '\n';
}
return 0;
}
由样例画一个图,可以发现,是四个为一组,组成了一个环,并且模拟一下n % 4 == 3的情况,很遗憾,我模拟错了,所以wa了一发。可以发现三个是无解的,然后根据环可以看出,每个数的位置是环中上一步的数,总之,将一组数找到,然后依据这个关系放入序列中。
Dice Throwing
题解
一道DP题,看题不仔细,有一点“at least x”没看到,白调了半天