Advertisement
Guest User

Untitled

a guest
Sep 21st, 2019
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.43 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long LL;
  5. typedef pair<int, int> PII;
  6. typedef vector<int> VI;
  7. typedef vector<double> VD;
  8. #define MP make_pair
  9. #define PB push_back
  10. #define X first
  11. #define Y second
  12.  
  13. #define FOR(i, a, b) for(int i = (a); i < (b); ++i)
  14. #define RFOR(i, b, a) for(int i = (b) - 1; i >= (a); --i)
  15. #define ITER(it, a) for(__typeof(a.begin()) it = a.begin(); it != a.end(); ++it)
  16. #define ALL(a) a.begin(), a.end()
  17. #define SZ(a) (int)((a).size())
  18. #define FILL(a, value) memset(a, value, sizeof(a))
  19. #define debug(a) cout << #a << " = " << a << endl;
  20.  
  21. const double PI = acos(-1.0);
  22. const LL INF = 1e9;
  23. const LL LINF = INF * INF;
  24. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  25. int dp[21][1 << 22];
  26. int was[61];
  27. int mask1 , mask2 , lenM1 , lenM2;
  28.  
  29. void findMasks(int len , int mask , int bit)
  30. {
  31. mask2 = (mask >> (bit + 1));
  32. mask1 = mask ^ (mask2 << (bit + 1));
  33. mask2 <<= 1;
  34. if((mask1 >> bit) & 1)
  35. mask1 ^= (1 << bit);
  36. lenM1 = bit - 1;
  37. lenM2 = len - bit;
  38. }
  39. void updYe(int len , int mask , int bit)
  40. {
  41. findMasks(len , mask , bit);
  42. was[dp[lenM1][mask1] ^ dp[lenM2][mask2]] = 1;
  43. was[dp[len][mask ^ (1 << bit)]] = 1;
  44. }
  45. void updNema(int len , int mask , int bit)
  46. {
  47. if(bit == 1 && (mask & 1))
  48. return;
  49. if(bit == len && (mask & (1 << (len + 1))))
  50. return;
  51. findMasks(len , mask , bit);
  52. mask2 |= 1;
  53. mask1 |= (1 << (lenM1 + 1));
  54. was[dp[lenM1][mask1] ^ dp[lenM2][mask2]] = 1;
  55. }
  56.  
  57.  
  58. #define ll long long
  59. #define ld long double
  60. #define vll vector <ll>
  61. #define vvll vector <vll>
  62. #define pll pair <ll, ll>
  63.  
  64. #define rep(i, a, b) for(ll i = a; i < b; i++)
  65. #define per(i, a, b) for(ll i = a - 1; i >= b; --i)
  66.  
  67. #define endl "\n"
  68. #define pb push_back
  69. #define pf push_front
  70.  
  71. #define all(v) (v).begin(), (v).end()
  72. #define rall(v) (v).rbegin(), (v).rend()
  73.  
  74. #define sorta(v) sort(all(v))
  75. #define sortd(v) sort(rall(v))
  76. #define vld vector<ld>
  77.  
  78. #define debug if (1)
  79.  
  80. #define test if(1)
  81.  
  82. #define log(val) debug {cout << "\n" << #val << ": " << val << "\n";}
  83.  
  84. #define ios ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  85.  
  86. #define mod (ll)(1e9 + 7)
  87.  
  88. ostream & operator << (ostream & out, vll & a) {
  89. for(auto i : a) out << i << " ";
  90. return out;
  91. }
  92.  
  93. istream & operator >> (istream & in, vll & a) {
  94. for(auto &i : a) in >> i;
  95. return in;
  96. }
  97.  
  98. long long dp1[21][1 << 22];
  99. ll used[50];
  100. ll bits[22];
  101.  
  102. void precalc() {
  103.  
  104. bits[0] = 1;
  105. rep(i, 1, 22) {
  106. bits[i] = (bits[i - 1] + 1) * 2 - 1;
  107. }
  108.  
  109. rep(n, 1, 21) {
  110. per(mask, (1 << n), 0) {
  111.  
  112. fill(used, used + 2 * n + 2, 0);
  113.  
  114. rep(i, 0, n) {
  115. if((mask & (1 << i))) {
  116. ll x1 = 0, x2 = 0;
  117. if(i + 1 < n) {
  118. if(mask & (1 << (i + 1))) {
  119. x2 = (i + 2 < n ? dp1[n - i - 2][mask >> (i + 2)] : 0);
  120. } else {
  121. x2 = 1 ^ (i + 2 < n ? dp1[n - i - 2][mask >> (i + 2)] : 0);
  122. }
  123. }
  124. if(i - 1 >= 0) {
  125. if(mask & (1 << (i - 1))) {
  126. x1 = (i - 2 >= 0 ? dp1[i - 2 + 1][mask & bits[i - 2]] : 0);
  127. } else {
  128. x1 = 1 ^ (i - 2 >= 0 ? dp1[i - 2 + 1][mask & bits[i - 2]] : 0);
  129. }
  130. }
  131. /*if(n == 2 && mask == 2) {
  132. log(i);
  133. cout << "First : " << endl;
  134. cout << x1 << " " << x2 << endl;
  135. }*/
  136.  
  137. used[x1 ^ x2] = 1;
  138. } else {
  139. /*if(n == 2 && mask == 2) {
  140. log(i);
  141. cout << "Second : " << endl;
  142. cout << dp1[n][mask ^ (1 << i)] << " " << ((i - 1 >= 0 ? dp1[i - 1 + 1][mask & bits[i - 1]] : 0) ^ (i + 1 < n ? dp1[n - i - 1][mask >> (i + 1)] : 0)) << endl;
  143. }*/
  144. used[dp1[n][mask ^ (1 << i)]] = 1;
  145. used[(i - 1 >= 0 ? dp1[i - 1 + 1][mask & bits[i - 1]] : 0) ^ (i + 1 < n ? dp1[n - i - 1][mask >> (i + 1)] : 0)] = 1;
  146. }
  147. }
  148. ll in = 0;
  149. while(used[in])in++;
  150. dp1[n][mask] = in;
  151. }
  152. }
  153.  
  154. }
  155.  
  156. ll solve(string & s) {
  157.  
  158. ll ans = 0;
  159. ll cur = 0;
  160. ll cnt = 0;
  161. ll n = s.size();
  162. rep(i, 0, s.size()) {
  163.  
  164. if(s[i] == 'A') {
  165. if(i - 1 >= 0 && !(i - 2 >= 0 && s[i - 2] == 'A')) {
  166. if(s[i - 1] == 'B' || s[i - 1] == 'C') {
  167. if(cnt - 2 >= 0)
  168. ans ^= dp1[cnt - 1][cur & bits[cnt - 2]];
  169. } else if(s[i - 1] == 'D') {
  170. ans ^= 1;
  171. if(cnt - 2 >= 0)
  172. ans ^= dp1[cnt - 1][cur & bits[cnt - 2]];
  173. }
  174. }
  175.  
  176. cnt = 0;
  177. cur = 0;
  178. if(i + 1 < n) {
  179. if(s[i + 1] == 'D') {
  180. ans ^= 1;
  181. }
  182. }
  183. i++;
  184.  
  185. } else if(s[i] == 'B') {
  186. cur |= (1 << cnt);
  187. cnt++;
  188. } else if(s[i] == 'D') {
  189. cnt++;
  190. } else {
  191. ans ^= dp1[cnt][cur];
  192. cnt = 0;
  193. cur = 0;
  194. }
  195. }
  196.  
  197. if(cnt != 0) {
  198. ans ^= dp1[cnt][cur];
  199. }
  200.  
  201. return ans;
  202. }
  203.  
  204. string getS(ll num) {
  205. test {
  206. if(!num) return ".I.";
  207. else if(num == 1) return (rand() % 2 == 0 ? "II." : ".II");
  208. else if(num == 2) return "III";
  209. else return "I.I";
  210. }
  211. else {
  212. string s;
  213. cin >> s;
  214. return s;
  215. }
  216. }
  217.  
  218. int main()
  219. {
  220. //ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  221. //freopen("In.txt", "r", stdin);
  222. //freopen("In.txt", "w", stdout);
  223. for(int len = 1; len <= 20; len++)
  224. {
  225. for(int mask = 0; mask < (1 << (len + 2)); mask++)
  226. {
  227. memset(was , 0 , sizeof was);
  228. for(int bit = 1; bit <= len; bit++)
  229. {
  230. if((mask >> bit) & 1)
  231. updYe(len , mask , bit);
  232. else
  233. updNema(len , mask , bit);
  234. }
  235.  
  236. int ans = 0;
  237. while(was[ans])
  238. ans++;
  239. dp[len][mask] = ans;
  240. }
  241.  
  242. }
  243.  
  244.  
  245. precalc();
  246. cout << "start : " << endl;
  247. while(true) {
  248. int n;
  249. test n = rand() % 10 + 1;
  250. else cin >> n;
  251. int mask = 0;
  252. int len = 0;
  253. int xrSum = 0;
  254.  
  255. string cur = "";
  256. string prevs = "";
  257. for(int i = 0; i < n; i++)
  258. {
  259. string s;
  260. s = getS(rand() % 4);
  261. if(s == prevs && s == ".I.") s = "III";
  262. prevs = s;
  263. int type;
  264. if(s == ".I.") {
  265. type = 1;
  266. cur += "A";
  267. }
  268. else if (s == "II." || s == ".II") {
  269. type = 2;
  270. cur += "B";
  271. }
  272. else if (s == "III") {
  273. type = 3;
  274. cur += "D";
  275. }
  276. else {
  277. type = 4;
  278. cur += "C";
  279. }
  280. if(type == 1)
  281. {
  282. mask |= (1 << (len + 1));
  283. xrSum ^= dp[len][mask];
  284. len = 0;
  285. mask = 1;
  286. }
  287. if(type == 4)
  288. {
  289. xrSum ^= dp[len][mask];
  290. len = 0;
  291. mask = 0;
  292. }
  293. if(type == 3)
  294. {
  295. len++;
  296. mask |= (1 << len);
  297.  
  298. }
  299. if(type == 2)
  300. len++;
  301. }
  302.  
  303. xrSum ^= dp[len][mask];
  304. //cout << xrSum << endl;
  305. //cout << solve(cur) << endl;
  306. //cout << xrSum << endl;
  307. ll cur1 = xrSum, cur2 = solve(cur);
  308.  
  309. cout << cur << " " << cur1 << " " << cur2 << endl;
  310.  
  311. /*test{}else{
  312. cout << cur1 << " " << cur2 << endl;
  313. }*/
  314.  
  315. if(cur1 != cur2) {
  316. cout << cur1 << ' ' << cur2 << " " << cur << endl;
  317. return 0;
  318. }
  319. }
  320.  
  321. //cerr << "Time elapsed: " << clock() / (double)CLOCKS_PER_SEC << endl;
  322. return 0;
  323.  
  324. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement