Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

位运算难道不是O(1)?..

Posted by kamel52045386 at 2008-07-21 12:25:08 on Problem 2965 and last updated at 2008-07-21 14:59:05
我用的是BFS+位运算的判重。
一共会有2^16个状态,每个状态会有16次的转移,每次转移会有10次运算,
所以2^16*16*10=10^7,所以位运算不是O(1)?。。  不解,谢谢。

下面是TLE的代码,希望Cow们帮我分析一下~~ 谢谢
#include<stdio.h>
#include<queue>
#include<cstdlib>
using namespace std;
struct NODE
{
  int sta;       
  int len;
  int num;     
};
void set(int &sta,int x)
{
     sta|=(1<<x);     
}
void flip(int &sta,int x)
{
    sta^=(1<<x); 
}
bool has[(1<<16)];
char s[4];
queue<NODE> q;
int main()
{
  int i,j;
  int sta=0;
  memset(has,0,sizeof(has));
  for(i=0;i<4;i++) 
  {
      scanf("%s",s);                 
      for(j=0;j<4;j++)             
      if(s[j]=='-')
      set(sta,4*i+j);             
  }  
  int ans; NODE node;
  node.sta=sta;node.len=0;node.num=0; has[sta]=1;
  q.push(node);
  while(!q.empty())
  {
     node=q.front();q.pop();                 
     int temp=node.sta;
     int nn,ll;
     nn=node.num;
     ll=node.len;
     if(temp==((1<<16)-1))
     {
      printf("%d\n",ll);         
      for(i=0;i<16;i++) if(nn&(1<<i)) printf("%d %d\n",i/4+1,i%4+1);      
      break;                     
     }        
     
       for(i=0;i<16;i++)
       { 
           if((1<<i)&nn) continue; 
           int kk=temp;  
           flip(kk,i);
           int x,y;
           x=i/4;y=i%4;
           for(j=0;j<4;j++)
           {
           flip(kk,4*x+j);                   
           flip(kk,4*j+y);                
           }      
               if(!has[kk])
               {
               NODE tp;
               has[kk]=1;
               tp.sta=kk;             
               tp.len=ll+1;             
               tp.num=(nn|(1<<i));     
               q.push(tp);        
               }
           
       }
                   
  }
 //system("pause");
 return 0;   
}


PS: G++ 的位运算要比C++的快近一倍?
   

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator