結果
問題 | No.2672 Subset Xor Sum |
ユーザー |
![]() |
提出日時 | 2024-03-15 21:49:49 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 353 ms / 2,000 ms |
コード長 | 2,024 bytes |
コンパイル時間 | 942 ms |
コンパイル使用メモリ | 97,872 KB |
実行使用メモリ | 325,164 KB |
最終ジャッジ日時 | 2024-09-30 04:18:14 |
合計ジャッジ時間 | 6,717 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 66 |
ソースコード
#include <iostream>#include <vector>#include <algorithm>#include <stack>#include <queue>#include <set>#include <map>#include <random>#include <time.h>#include <map>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個より多いなら鳩ノ巣原理より、一致するものが存在//よってYesif(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]<n){//cout << dp[1][n][0] << endl;cout << "Yes" << endl;}else{cout << "No" << endl;}}}}