Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Слава Україні, Героям слава
- #include <bits/stdc++.h>
- using namespace std;
- int main() {
- //ios_base::sync_with_stdio(false);
- //cin.tie(nullptr);
- freopen("in.txt", "r", stdin);
- freopen("out.txt", "w", stdout);
- string s;
- long long ans = 0;
- while(cin >> s) {
- string ss;
- cin >> ss;
- stringstream X(ss);
- vector<int> v;
- string tmp;
- while(getline(X, tmp, ',')) {
- v.push_back(stoi(tmp));
- }
- s = s + '?' + s + '?' + s + '?' + s + '?' + s;
- vector<int> y = v;
- v.insert(v.end(), y.begin(), y.end());
- v.insert(v.end(), y.begin(), y.end());
- v.insert(v.end(), y.begin(), y.end());
- v.insert(v.end(), y.begin(), y.end());
- int n = s.size(), m = v.size();
- vector<vector<vector<long long>>> dp(2 * n + 1, vector<vector<long long>>(m + 1, vector<long long>(2, -1)));
- function<long long(int, int, bool)> calc = [&](int i, int j, bool placed) {
- if(i > n and !placed) return dp[i][j][placed] = 0;
- if(i > n + 1) return dp[i][j][placed] = 0;
- if(dp[i][j][placed] != -1) return dp[i][j][placed];
- if(placed) {
- for(int k = i - v[j - 1] - 1; k < i - 1; k++) {
- if(s[k] == '.') {
- return dp[i][j][placed] = 0;
- }
- }
- if(i != n + 1) {
- if(s[i - 1] == '#') return dp[i][j][placed] = 0;
- }
- }
- if(j == m) {
- bool ok = true;
- for(int k = i; k < n; k++) {
- ok &= (s[k] != '#');
- }
- return dp[i][j][placed] = ok;
- }
- long long ans = 0;
- if(s[i] != '.') {
- ans += calc(i + v[j] + 1, j + 1, true);
- }
- if(s[i] != '#') {
- ans += calc(i + 1, j, false);
- }
- return dp[i][j][placed] = ans;
- };
- ans += calc(0, 0, false);
- }
- cout << ans << "\n";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement