fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. // n(<=23)が小さいとき,全探索
  5. int nsmall(int n,int m,const vector<bitset<501>>& bits){
  6. int ret = 0;
  7. for(int i=0;i<(1<<n);i++) {
  8. bitset<501> used;
  9. int cnt = 0;
  10. for(int j=0;j<n;j++){
  11. if((i>>j) & 1) {
  12. used = used ^ bits[j];
  13. cnt++;
  14. }
  15. }
  16. if(used.none()){
  17. ret = max(ret,cnt);
  18. }
  19. }
  20. return ret;
  21. }
  22. // mが小さいとき,レシピの状態でDP
  23. vector<vector<int>> dp;
  24. int msmall(int n,const int N,int used,const vector<int>& b){
  25. if(n == N){
  26. if(used == 0)return 0;
  27. else return -1e9;
  28. }
  29. if(dp[n][used] != -1)
  30. return dp[n][used];
  31.  
  32. return dp[n][used] = max(msmall(n+1, N, used ^ b[n], b) + 1,
  33. msmall(n+1, N, used, b));
  34. }
  35.  
  36. bool solve(){
  37. int n,m;
  38. cin >> n >> m;
  39. if(n == 0 && m == 0)
  40. return false;
  41. vector<string> vs(n);
  42. for(int i=0;i<n;i++){
  43. cin >> vs[i];
  44. }
  45. vector<bitset<501>> bits(n);
  46. vector<int> b(n);
  47. for(int i=0;i<n;i++){
  48. for(int j=0;j<m;j++){
  49. if(vs[i][j] == '1'){
  50. bits[i].set(j);
  51. b[i] |= (1<<j);
  52. }
  53. }
  54. }
  55. if(n <= 23){
  56. cerr << "n:" << n << endl;
  57. cout << nsmall(n,m,bits) << endl;
  58. }else{
  59. cerr << "m:" << m << endl;
  60. dp = vector<vector<int>>(n,vector<int>((1<<m),-1));
  61. cout << msmall(0,n,0,b) << endl;
  62. }
  63. return true;
  64. }
  65.  
  66. int main(void) {
  67. while(solve()){}
  68. return 0;
  69. }
  70.  
Success #stdin #stdout #stderr 0.52s 16064KB
stdin
22 22
1000011001101101110011
1001110101010001111101
0010101101111010101010
0110000101110000001110
0111111110101010011011
0100111000101011000010
0000111111110101110001
0101110111111101110110
0110011010011001010001
0100001111011001110001
0001010110111001011001
1100010001111111001110
1010110101010110010110
0111001101100101110000
0110110011001011110100
1000011001101101110011
0000110110111011111010
1011001101010101110011
1100001110010010100110
1000101111101110011000
1000010001100010110111
0110000001000001100111
125 4
0001
0110
0110
1000
1100
1110
1101
0100
0001
0011
1011
0011
0111
1010
0001
1100
0011
1001
1001
1000
1011
0001
1111
1111
0010
0100
1111
1011
1011
0011
0011
0101
1110
0010
0011
1101
1010
1111
1111
0111
1001
0101
1111
1111
0100
0011
0111
0110
0001
1000
0100
0010
0100
0011
1011
1000
1010
1011
1110
0100
0010
1100
0101
0011
0110
1010
1101
0111
1000
1000
0011
0110
1100
1111
1100
0111
0111
1011
0111
1101
1000
1000
0100
1010
1101
1110
1011
1000
0011
1011
0010
1101
0100
1010
0011
1010
0011
1101
0111
1001
1100
1110
1011
1000
1100
1111
1101
0110
0011
1100
0100
1110
0011
1000
0111
1111
0100
1000
1011
1110
1000
0111
1010
0001
1110
0 0
stdout
14
124
stderr
n:22
m:4