Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:3000MS以下是如何做到的??In Reply To:3000MS以下是如何做到的?? Posted by:ZxMYS at 2009-04-01 12:10:08 > orz 这样做的:(复杂度O(N*2^(N/2))) Source Code Problem: 1903 User: tasty Memory: 264K Time: 47MS Language: C++ Result: Accepted Source Code #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; struct pp { int id,value,cnt; bool operator <(const pp &temp)const { if(value==temp.value) return cnt>temp.cnt; return value<temp.value; } }; int a[30],ansstate,n[2]; pp list[2][1<<12]; char tmp[1000000]; int main() { int N,i,j,s,p,q; scanf("%d",&N); for(int i=1;i<=N;i++) { scanf("%s",tmp); int state=0; for(int j=0;tmp[j];j++) state|=(1<<(tmp[j]-'A')); a[i]=state; } int ans=0,orz[2]; n[0]=N/2; n[1]=N-n[0]; orz[0]=0; orz[1]=n[0]; for(i=0;i<2;i++) for(j=0;j<(1<<n[i]);j++) { list[i][j].value=list[i][j].cnt=0; list[i][j].id=j; for(s=0;s<n[i];s++) { if(j&(1<<s)) { list[i][j].value^=a[s+orz[i]+1]; list[i][j].cnt++; } } } sort(list[0],list[0]+(1<<n[0])); sort(list[1],list[1]+(1<<n[1])); for(i=0,j=0;i<(1<<n[0])&&j<(1<<n[1]);) { if(list[0][i].value<list[1][j].value) i++; else if(list[0][i].value>list[1][j].value) j++; else { if(list[0][i].cnt+list[1][j].cnt>ans) { ans=list[0][i].cnt+list[1][j].cnt; ansstate=list[0][i].id+(list[1][j].id<<n[0]); } i++; } } printf("%d\n",ans); for(int i=0;i<N;i++) if(ansstate&(1<<i)) printf("%d ",i+1); printf("\n"); // system("pause"); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator