#include #include #include #include #include #include #include #include #include #include using namespace std; int n,a[500000],sum; //dp[flag][i][j] = //i個目まで見てxorがjであるようなとき //aの要素の使用個数の最小値 //flag:1つ以上使ったか? int dp[2][5010][1<<13]; int main() { cin >> n; for(int i = 0; i < n; i++) { cin >> a[i]; sum ^= a[i]; } //すべてのxorが0出ないなら存在しない if(sum != 0) { cout << "No" << endl; } else { //5001個より多いなら鳩ノ巣原理より、一致するものが存在 //よってYes if(n>5001) { cout << "Yes" << endl; } else { for(int i = 0; i <= n; i++) { for(int j = 0; j < (1<<13); j++) { dp[0][i][j] = dp[1][i][j] = 100000; } } dp[0][0][0] = 0; for(int i = 0; i < n; i++) { for(int j = 0; j < (1<<13); j++) { if(dp[0][i][j]<100000) { //printf("[%d:%d]%d->%d\n",i,j,j,j^a[i]); dp[0][i+1][j] = min(dp[0][i+1][j],dp[0][i][j]); dp[1][i+1][j^a[i]] = min(dp[1][i+1][j^a[i]],dp[0][i][j]+1); } if(dp[1][i][j]<100000) { dp[1][i+1][j] = min(dp[1][i+1][j],dp[1][i][j]); dp[1][i+1][j^a[i]] = min(dp[1][i+1][j^a[i]],dp[1][i][j]+1); } } } if(dp[1][n][0]