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 |
自己给自己回复In Reply To:还没过……WA了三次MLE两次TLE四次……留个代码在这,以后有心情再修改……应该说有能力再修改……哪位好心路过帮我看看T_T Posted by:15914304086 at 2012-03-18 17:06:27 本题目: 1.题目的意思是所给出的星座出现了多少种,而不是出现了多少个(很重要) 2.存储天空全部星星,如果定义char数组,应该大小是sky[1001][1001]预留一位给'\0', 读入时可以把一行看成一个字符串scanf("%s",sky+i); 3.我是把全部星星转换成一个__int64的数组s(二维,大小1000*1000,一行的和转为一个__int64的数字), 然后每读入一个星座,又转换为一个__int64的数组ss(一维,大小50)(纯属个人做法) 然后看看s里面是否有s(暴力寻找)。 4.转换为__int64就是把"*0"看成一个二进制数, 这里可以采用<<运算符,1<<0=2^0=1,1<<2=2^2=4,3<<4=3*2^4=48(我做这题才知道,唉) 5.采用<<,要用1LL<<n,因为1是整型,如果n太大就会溢出,所以首先把1转换为long long类型。 6.数组下标有点注意:程序寻找s[i][j+3]要比s[j+3][i]要快,百度上看到的,说是跟cache有关 7.把一行转换为__int64,就像计算某一行2到7位的和,可以用之前的1-6位的和除以2(二进制下的效果就相当于去掉第一位然后除以2),加上第七位。 今天终于AC了…… #include <iostream> using namespace std; int main() { int n,m,t,p,q,x,y,i,j,u,ci=0,all; char sky[1001][1001],star[51][51]; long long si,s[1000][1000],ss[50],*k; while(1) { cin>>n>>m>>t>>p>>q; if (n) { for (i=0;i<n;i++) scanf("%s",sky+i); x=n-p; y=m-q; all=0; if (x<0 || y<0) while (t--) for (i=0;i<p;i++) scanf("%s",star+i); else { u=q-1; for (i=0;i<n;i++) { si=0; for (j=0;j<q;j++) if (sky[i][j]=='*') si+=1LL<<j; s[0][i]=si; for (j=1;j<=y;j++) { si/=2; if (sky[i][j+u]=='*') si+=1LL<<u; s[j][i]=si; } } while(t--) { for (i=0;i<p;i++) { scanf("%s",star+i); si=0; for (j=0;j<q;j++) if (star[i][j]=='*') si+=1LL<<j; ss[i]=si; } for (j=0;j<=y;j++) { for (i=0;i<=x;i++) { for (n=0,k=s[j]+i;n<p;n++,k++) if (*k!=ss[n]) break; if (n==p)//found break; } if (i<=x)//found break; } if (j<=y) all++; } } printf("Case %d: %d\n",++ci,all); } else break; } return 0; //9949763 ????? 3690 Accepted 9060K 1704MS C++ 1249B 2012-03-20 11:12:27 (慢了点,代码长度还不错,挤进前20了) } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator