Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const ll MOD = 1e9 + 7;
- const int MAXN = 1100;
- int N;
- string S;
- int cv[MAXN];
- vector <int> nswap[MAXN];
- int cbad;
- void sswap (int x)
- {
- // swap x, x + 1)
- if (cv[x] + (int) S[x] == (int) '1')
- cbad--;
- if (cv[x+1] + (int) S[x+1] == (int) '1')
- cbad--;
- swap (cv[x], cv[x+1]);
- if (cv[x] + (int) S[x] == (int) '1')
- cbad++;
- if (cv[x+1] + (int) S[x+1] == (int) '1')
- cbad++;
- }
- ll figure (int n1)
- {
- for (int i = 0; i < N; i++)
- {
- cv[i] = 0;
- nswap[i].clear();
- }
- int n0 = N - n1;
- // 1s are +n0, 0s are -n1
- int cs = 0;
- for (int i = 0; i < S.length(); i++)
- {
- if (cs + n0 < N)
- {
- cv[i] = 1;
- cs += n0;
- }
- else
- {
- cv[i] = 0;
- cs -= n1;
- }
- nswap[cs].push_back(i);
- }
- cbad = 0;
- for (int i = 0; i < N; i++)
- {
- if (cv[i] + (int) S[i] == (int) '1')
- cbad++;
- }
- int res = 0;
- if (!cbad) res++;
- for (int i = N - 1; i > 0; i--)
- {
- if (!nswap[i].size()) continue;
- for (int j : nswap[i])
- sswap (j);
- if (!cbad) res++;
- }
- return res;
- }
- void gogo()
- {
- cin >> S;
- N = S.length();
- ll ans = 0;
- bool b0 = true, b1 = true;
- for (int i = 0; i < N; i++)
- {
- if (S[i] == '0') b1 = false;
- if (S[i] == '1') b0 = false;
- }
- if (b0) ans++;
- if (b1) ans++;
- for (int i = 1; i < N; i++)
- ans = (ans + figure (i)) % MOD;
- cout << ans << "\n";
- }
- int main()
- {
- ios_base::sync_with_stdio(0);
- int T; cin >> T;
- for (int t = 0; t < T; t++)
- {
- gogo();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement