Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- long long calc(int ind, int used, int rem, bool change, int str, int used_l, const string & s, const string & p) {
- if (rem < 0)
- return 0;
- if (ind == p.size())
- return rem == 0 && !change;
- long long & r = dp[used][rem][change][str];
- if (r != -1)
- return r;
- r = 0;
- int letters = 0;
- char cur_l;
- for (int i = 0; i < (int)p.size(); ++i) {
- if (!((used >> i) & 1)) {
- cur_l = p[i];
- if ((letters >> (cur_l - 'a')) & 1) // don't reuse a char we used her before or u wilong long consider duplicates (cc gg case)
- continue;
- letters |= (1 << (cur_l - 'a'));
- r += calc(ind + 1, used | (1 << i), rem - abs(s[ind] - cur_l), change, str, used_l | (1 << (cur_l - 'a')), s, p);
- if (change) { // try 1 change for any
- if (!((used_l >> (cur_l - 1 - 'a')) & 1)) // don't reuse a char we used her before or u wilong long consider duplicates (cc gg case)
- r += calc(ind + 1, used | (1 << i), rem - abs(s[ind] - (cur_l - 1)), 0, str, used_l | (1 << (cur_l - 1 - 'a')), s, p);
- if (!((used_l >> (cur_l + 1 - 'a')) & 1))
- r += calc(ind + 1, used | (1 << i), rem - abs(s[ind] - (cur_l + 1)), 0, str, used_l | (1 << (cur_l + 1 - 'a')), s, p);
- }
- }
- }
- return r;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement