本文共 2180 字,大约阅读时间需要 7 分钟。
水题
水题
水题,注意数组不要开小了
这道题思路很妙:
首先计算出字符串中所有 1 的数量 cnt,然后分三种情况:
当 cnt > 1 时:
cnt - 1,要么为 cnt + 1。我们可以先按原字符串计算这两种情况,然后在每一位上进行加减。对于 0 位,只需要加上 2^k 再对 cnt + 1 取模。对于 1 位,只需要减去 2^k(注意负数取模)再对 cnt + 1 取模。 当 cnt = 1 时:
1,模数只能是 cnt + 1。对于 0 位,直接输出 0 即可。 当 cnt = 0 时:
1 即可。 #includeusing namespace std;typedef long long ll;ll power(ll a, ll b, ll mod) { return b ? power(a * a % mod, b / 2, mod) * (b % 2 ? a : 1) % mod : 1;}ll cal(ll n) { ll cnt = 1; while (n) { n = n % __builtin_popcount(n); cnt++; } return cnt;}int main() { ll n, cnt = 0, ans1 = 0, ans2 = 0, ans; string s; cin >> n >> s; for (int i = 0; i < n; i++) { if (s[i] == '1') cnt++; } if (cnt > 1) { for (ll i = 0; i < n; i++) { if (s[i] == '1') { ans1 = (ans1 + power(2, n - i - 1, cnt - 1)) % (cnt - 1); ans2 = (ans2 + power(2, n - i - 1, cnt + 1)) % (cnt + 1); } } for (ll i = 0; i < n; i++) { if (s[i] == '0') { ans = (ans2 + power(2, n - i - 1, cnt + 1)) % (cnt + 1); cout << cal(ans) << endl; } else { ans = (ans1 + ((cnt - 1) - power(2, n - i - 1, cnt - 1) % (cnt - 1)) % (cnt - 1)) % (cnt - 1); cout << cal(ans) << endl; } } } else if (cnt == 1) { for (int i = 0; i < n; i++) { if (s[i] == '1') { ans2 = (ans2 + power(2, n - i - 1, cnt + 1)) % (cnt + 1); } } for (ll i = 0; i < n; i++) { if (s[i] == '0') { ans = (ans2 + power(2, n - i - 1, cnt + 1)) % (cnt + 1); cout << cal(ans) << endl; } else { cout << 0 << endl; } } } else { for (int i = 0; i < n; i++) { cout << 1 << endl; } } return 0;}
1的数量:遍历字符串,统计1的数量cnt。cnt的值,选择不同的计算方式。0还是1,分别计算并输出结果。通过这种方法,可以高效地解决字符串变换问题,并确保结果正确。
转载地址:http://aaykz.baihongyu.com/