Advertisement
Kaidul

10651

Mar 18th, 2013
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.40 KB | None | 0 0
  1. #include <algorithm>
  2. #include <bitset>
  3. #include <cctype>
  4. #include <cmath>
  5. #include <complex>
  6. #include <cstdio>
  7. #include <cstdlib>
  8. #include <cstring>
  9. #include <ctime>
  10. #include <deque>
  11. #include <fstream>
  12. #include <iostream>
  13. #include <list>
  14. #include <map>
  15. #include <memory>
  16. #include <queue>
  17. #include <set>
  18. #include <sstream>
  19. #include <stack>
  20. #include <string>
  21. #include <utility>
  22. #include <vector>
  23. #include <iomanip>
  24. using namespace std;
  25. /*** typedef ***/
  26. #define MEMSET_INF 127
  27. #define MEMSET_HALF_INF 63
  28. #define stream istringstream
  29. #define rep(i,n) for(__typeof(n) i=0; i<(n); i++)
  30. #define repl(i,n) for(__typeof(n) i=1; i<=(n); i++)
  31. #define FOR(i,a,b) for(__typeof(b) i=(a); i<=(b); i++)
  32. #define INF (1<<30)
  33. #define PI acos(-1.0)
  34. #define pb push_back
  35. #define ppb pop_back
  36. #define all(x) x.begin(),x.end()
  37. #define mem(x,y) memset(x,y,sizeof(x))
  38. #define memsp(x) mem(x,MEMSET_INF)
  39. #define memdp(x) mem(x,-1)
  40. #define memca(x) mem(x,0)
  41. #define eps 1e-9
  42. #define pii pair<int,int>
  43. #define pmp make_pair
  44. #define ft first
  45. #define sd second
  46. #define vi vector<int>
  47. #define vpii vector<pii>
  48. #define si set<int>
  49. #define msi map<string , int >
  50. #define mis map<int , string >
  51. typedef long long i64;
  52. typedef unsigned long long ui64;
  53. /** function **/
  54. #define SDi(x) sf("%d",&x)
  55. #define SDl(x) sf("%lld",&x)
  56. #define SDs(x) sf("%s",x)
  57. #define SD2(x,y) sf("%d%d",&x,&y)
  58. #define SD3(x,y,z) sf("%d%d%d",&x,&y,&z)
  59. #define pf printf
  60. #define sf scanf
  61. #define READ(f) freopen(f, "r", stdin)
  62. #define WRITE(f) freopen(f, "w", stdout)
  63. const i64 INF64 = (i64)1E18;
  64.  
  65. template<class T> inline T gcd(T a,T b) {
  66.     if(a<0)return gcd(-a,b);
  67.     if(b<0)return gcd(a,-b);
  68.     return (b==0)?a:gcd(b,a%b);
  69. }
  70. template<class T> inline T lcm(T a,T b) {
  71.     if(a<0)return lcm(-a,b);
  72.     if(b<0)return lcm(a,-b);
  73.     return a*(b/gcd(a,b));
  74. }
  75. template<class T> inline T sqr(T x) {
  76.     return x*x;
  77. }
  78. template<class T> T power(T N,T P) {
  79.     return (P==0)?  1: N*power(N,P-1);
  80. }
  81. template<class T> bool inside(T a,T b,T c) {
  82.     return (b>=a && b<=c);
  83. }
  84.  
  85. double _dist(double x1,double y1,double x2,double y2) {
  86.     return sqrt(sqr(x1-x2)+sqr(y1-y2));
  87. }
  88. int distsq(int x1,int y1,int x2,int y2) {
  89.     return sqr(x1-x2)+sqr(y1-y2);
  90. }
  91. i64 toInt64(string s) {
  92.     i64 r=0;
  93.     istringstream sin(s);
  94.     sin>>r;
  95.     return r;
  96. }
  97.  
  98. double LOG(i64 N,i64 B) {
  99.     return (log10l(N))/(log10l(B));
  100. }
  101. string itoa(long long a) {
  102.     if(a==0) return "0";
  103.     string ret;
  104.     for(long long i=a; i>0; i=i/10) ret.push_back((i%10)+48);
  105.     reverse(ret.begin(),ret.end());
  106.     return ret;
  107. }
  108.  
  109. vector< string > token( string a, string b ) {
  110.     const char *q = a.c_str();
  111.     while( count( b.begin(), b.end(), *q ) ) q++;
  112.     vector< string >
  113.     oot;
  114.     while( *q ) {
  115.         const char *e = q;
  116.         while( *e && !count( b.begin(), b.end(),
  117.                              *e ) ) e++;
  118.         oot.push_back( string( q, e ) );
  119.         q = e;
  120.         while( count( b.begin(),
  121.                       b.end(), *q ) ) q++;
  122.     }
  123.     return oot;
  124. }
  125. int isvowel(char s) {
  126.     s=tolower(s);
  127.     if(s=='a' || s=='e' || s=='i' || s=='o' || s=='u')return 1;
  128.     return 0;
  129. }
  130. int isupper(char s) {
  131.     if(s>='A' and s<='Z') return 1;
  132.     return 0;
  133. }
  134. template<class T> struct Fraction {
  135.     T a,b;
  136.     Fraction(T a=0,T b=1);
  137.     string toString();
  138. };//NOTES:Fraction
  139. template<class T> Fraction<T>::Fraction(T a,T b) {
  140.     T d=gcd(a,b);
  141.     a/=d;
  142.     b/=d;
  143.     if (b<0) a=-a,b=-b;
  144.     this->a=a;
  145.     this->b=b;
  146. }
  147. template<class T> string Fraction<T>::toString() {
  148.     ostringstream sout;
  149.     sout<<a<<"/"<<b;
  150.     return sout.str();
  151. }
  152. template<class T> Fraction<T> operator+(Fraction<T> p,Fraction<T> q) {
  153.     return Fraction<T>(p.a*q.b+q.a*p.b,p.b*q.b);
  154. }
  155. template<class T> Fraction<T> operator-(Fraction<T> p,Fraction<T> q) {
  156.     return Fraction<T>(p.a*q.b-q.a*p.b,p.b*q.b);
  157. }
  158. template<class T> Fraction<T> operator*(Fraction<T> p,Fraction<T> q) {
  159.     return Fraction<T>(p.a*q.a,p.b*q.b);
  160. }
  161. template<class T> Fraction<T> operator/(Fraction<T> p,Fraction<T> q) {
  162.     return Fraction<T>(p.a*q.b,p.b*q.a);
  163. }
  164. //bool operator < ( const node& p ) const {      return dist > p.dist;   }
  165. int binToDec(char* s) {
  166.     int n = 0;
  167.     for(int i=0; s[i]!='\0'; i++) {
  168.         n = n*2 + s[i]-'0';
  169.     }
  170.     return n;
  171. }
  172. /** Disjoint Set **/
  173. vector < int > pset(100);
  174. void initSet(int _size) {
  175.     pset.resize(_size);
  176.     FOR(i,0,_size-1) pset[i]=i;
  177. }
  178. int findSet(int i) {
  179.     return (pset[i]== i)?i: (pset[i] = findSet(pset[i]));
  180. }
  181. void unionSet(int i,int j) {
  182.     pset[findSet(i)]=findSet(j);
  183. }
  184. bool isSameSet(int i,int j) {
  185.     return findSet(i)==findSet(j);
  186. }
  187. /** Bitamsk **/
  188. int SET(int N,int pos) {
  189.     return N=N | (1<<pos);
  190. }
  191. int RESET(int N,int pos) {
  192.     return N= N & ~(1<<pos);
  193. }
  194. int check(int N,int pos) {
  195.     return (N & (1<<pos));
  196. }
  197. int toggle(int N,int pos) {
  198.     if(check(N,pos))return N=RESET(N,pos);
  199.     return N=SET(N,pos);
  200. }
  201. void PRINTBIT(int N) {
  202.     printf("(");
  203.     for(int i=6; i>=1; i--)  {
  204.         bool x=check(N,i);
  205.         cout<<x;
  206.     }
  207.     puts(")");
  208. }
  209.  
  210. const i64 INFFF=1e16;
  211.  
  212. #define Max 12
  213. int result;
  214.  
  215. map <int, int> m;
  216. int var;
  217.  
  218. int pebbleSolitaire(int n) {
  219.     if ( m [n] )
  220.         return m [n];
  221.     int backup = n;
  222.  
  223.     for ( int i = 0; i < Max - 1; i++ ) {
  224.         if(check(n, i) && check(n, i + 1)) {
  225.             if(i + 2 < Max && !check(n, i + 2)) {
  226.                 n = SET(n, i + 2);
  227.                 n = RESET(n, i);
  228.                 n = RESET(n, i + 1);
  229.                 m[n] = pebbleSolitaire(n);
  230.                 n = backup;
  231.             }
  232.             if(i - 1 >= 0 && !check(n, i - 1)) {
  233.                 n = SET(n, i - 1);
  234.                 n = RESET(n, i);
  235.                 n = RESET(n, i + 1);
  236.                 m[n] = pebbleSolitaire(n);
  237.                 n = backup;
  238.             }
  239.         }
  240.     }
  241.  
  242.     int parity = 0;
  243.  
  244.     for ( int i = 0; i < Max; i++ ) {
  245.         if (check(n, i)) parity++;
  246.     }
  247.  
  248.     if ( parity < result )
  249.         result = parity;
  250.  
  251.     return result;
  252. }
  253.  
  254. int main () {
  255.     READ("in.txt");
  256.     int testCase;
  257.     scanf ("%d", &testCase);
  258.  
  259.     while ( testCase-- ) {
  260.         string input;
  261.         cin >> input;
  262.         var = 0;
  263.         for ( int i = 0; i < Max; i++ ) {
  264.             if (input.at(i) == 'o') var = SET(var, i);
  265.         }
  266.  
  267.         result = INF;
  268.  
  269.         printf ("%d\n", pebbleSolitaire(var));
  270.     }
  271.  
  272.     return 0;
  273. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement