Problem:
Score : 700 points

Problem Statement

Given is a sequence of N digits a_1a_2\ldots a_N, where each element is 1, 2, or 3.
Let x_{i,j} defined as follows:

x_{1,j} := a_j \quad (1 \leq j \leq N)

x_{i,j} := | x_{i-1,j} - x_{i-1,j+1} | \quad (2 \leq i \leq N and 1 \leq j \leq N+1-i)

Find x_{N,1}.

Constraints

2 \leq N \leq 10^6

a_i = 1,2,3 (1 \leq i \leq N)

Input

Input is given from Standard Input in the following format:

N
a_1a_2\ldotsa_N

Output

Print x_{N,1}.

Sample Input 1

4
1231

Sample Output 1

1

x_{1,1},x_{1,2},x_{1,3},x_{1,4} are respectively 1,2,3,1.

x_{2,1},x_{2,2},x_{2,3} are respectively |1-2| = 1,|2-3| = 1,|3-1| = 2.

x_{3,1},x_{3,2} are respectively |1-1| = 0,|1-2| = 1.

Finally, x_{4,1} = |0-1| = 1, so the answer is 1.

Sample Input 2

10
2311312312

Sample Output 2

0

Solution in C++14 (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

#include<bits/stdc++.h>
using namespace std;

#define ll long long
#define eb emplace_back
#define nl '\n'
#define deb(x) cerr << #x" = " << x << nl
#define in() ( { int a ; scanf("%d", &a); a; } )

const int N = 3e5 + 9;
const int mod = 1e9 + 7;

vector<pair<int, int>> modify(vector<pair<int, int>>& v)
{
    vector<pair<int, int>> ans;
    for(int i = 0, j; i < v.size(); i = j)
    {
        int cur = v[i].second;
        for(j = i + 1; j < v.size() && v[j].first == v[i].first; j++) cur += v[j].second;
        ans.eb(v[i].first, cur);
    }
    return ans;
}
void trap(vector<pair<int, int>> &v)
{
    int ok = 1;
    for(int i = 0; i < v.size(); i++){
        if(v[i].first == 2){
            ok = 0; break;
        }
    }
    if(!ok) return;
    vector<int> a;
    for(int i = 0; i < v.size(); i++) while(v[i].second--) a.eb(v[i].first);
    int mask = (int)a.size() - 1;
    int ans = a[0];
    for(int sub = mask; sub; sub = (sub - 1) & mask) ans ^= a[sub];
    cout << ans << nl;
    exit(0);
}
int32_t main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int n; string s; cin >> n >> s;
    n = s.size();
    if(n == 2) return cout << abs(s[0] - s[1]) << nl, 0;
   // int ans = 0;
    //for(int i = 0; i < s.size(); i++) ans += (i & 1 ? -1 : 1) * (s[i] - '0');
    vector<pair<int, int>> v;
    for(int i = 1; i < n; i++) v.eb(abs(s[i] - s[i - 1]), 1);
    auto cur = modify(v);
    while(1){
        if(cur.size() == 1) break;
//        for(auto x: cur) cout << x.first << ' ' << x.second << ") (";
//        cout << nl;
        trap(cur);
        vector<pair<int, int>> to;
        for(int i = 0; i < cur.size(); i++){
            if(i){
                auto a = cur[i - 1], b = cur[i];
                to.eb(abs(a.first - b.first), 1);
            }
            int p = cur[i].second;
            if(p > 1) to.eb(0, p - 1);
        }
//        for(auto x: to) cout << x.first << ' ' << x.second << ") (";
//        cout << nl << nl;
        cur = modify(to);
    }
    if(cur[0].second == 1) cout << cur[0].first << nl;
    else cout << 0 << nl;
    //cout << ans % 3 << nl;
    return 0;
}