|
Posted on 2010-04-03 20:35 Uriel 閱讀(462) 評論(0) 編輯 收藏 引用 所屬分類: POJ 、 模擬
這題快一年前就看了,覺得太麻煩就一直沒做,昨天心情不爽于是又拿來做找刺激。。結果完全杯具。。今天晚上才過掉。。 昨天寫的方法是:先把要輸出的那個表格存進一個char型數組,覺得這樣輸出的時候不那么糾結。。但是這題沒說STR型的數據最多多長,于是不停的提交來試。。結果就是MLE, RE, WA, OLE, TLE...加起來快60次。。以為是哪里沒考慮到,于是-0這樣的惡心數據也考慮了,負數也考慮了,空數據也考慮了。。還是一次次的杯具。。 最后實在受不了了,于是改方法,不存結果,最后一行一行輸出。。竟然一下就過了。。。但是G++還是TLE,不知原因啊。。也許memset太多了。。 都不知道這題到底什么trick了。。能考慮的都考慮了。。(知道的只有-0的情況不要考慮),代碼夾雜了一堆調試的語句和第一種方法的部分。。也懶得改了。。貼個代碼。。哪位一樣被這題虐的ACMer可以對拍下數據什么的。。具體代碼就不要看了。。丑陋至極。。10527B。。
 /**//*
Problem: 3699 User: Uriel
Memory: 21832K Time: 157MS
Language: C++ Result: Accepted
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;

#define MAXN 10001

char P[MAXN][11][201];
int n;//col總數
int m;//記錄總數
int qry;//每個詢問有多少個屬性
int k;//共有幾個詢問
int q;//0->'='; 1->'<'; 2->'>'
int si;//0->限制條件為int,1->限制條件為string
int nres;//滿足條件的結果數
int cons;//限制條件是第幾個col
char xd[11][201];//存需要輸出的屬性的名字
int id[11];//存要輸出的屬性的代號
int kind[11];//每個col的數據類型,0為string,1為int
char col[11][201];//每個col的名字
int res[MAXN];//存滿足限制條件的結果的序號(輸入序號,非ID)
int width,height;//最后結果的寬和高
//char ans[MAXN+5][3200];//存最后要輸出的結果
int val;
int maxl;
char str[301];
char sample[301];
char type[11];//暫存每個col數值類型
char tmps[10];//去掉select,where
int maxdis[11];//輸出每一格的最大寬度

int main()
  {
int i,j,h;
char c;
memset(P,0x00,sizeof(P));
// freopen("out.txt","w",stdout);
scanf("%d %d %d",&n,&m,&k);
for(i=0;i<n;i++)
 {
scanf("%s %s",col[i],type);
// printf("*%s %s*\n",col[i],type);
if(strcmp(type,"STR")==0)
 {
kind[i]=1;
}
else
 {
kind[i]=0;
}
}
for(i=0;i<m;i++)
 {
for(j=0;j<n;j++)
 {
scanf("%s",P[i][j]);
// printf("* %d *\n",kind[j]);
// if(kind[j]==0 && P[i][j][0]=='-' && P[i][j][1]=='0')
// {
// printf("*");
// P[i][j][0]='0';
// P[i][j][1]='\0';
// }
// printf("*%s*\n",P[i][j]);
}
}
while(k--)
 {
scanf("%s",tmps);
// printf("*%s*\n",tmps);
getchar();
qry=0;
memset(xd,0x00,sizeof(xd));
while(1)
 {
int tmp=0;
while(1)
 {
c=getchar();
if(c==' ')
 {
qry++;
goto flag;
}
else if(c==',')break;
else
xd[qry][tmp++]=c;
}
// printf("* %s *\n",xd[qry]);
qry++;
}
// for(i=0;i<qry;i++)
// {
// printf("* %s *\n",xd[i]);
// }
flag: for(i=0;i<qry;i++)
 {
for(j=0;j<n;j++)
 {
if(strcmp(xd[i],col[j])==0)
 {
id[i]=j;
// printf("id[%d]=%d\n",i,j);
break;
}
}
}
j=0;
// getchar();
scanf("%s",tmps);
// printf("* %s *\n",tmps);
getchar();
memset(str,0x00,sizeof(str));
while(1)
 {
c=getchar();
if(c=='=')
 {
// printf("* %s *\n",str);
q=0;
for(i=0;i<n;i++)
 {
if(strcmp(col[i],str)==0)
 {
cons=i;
break;
}
}
// cons=i;
if(kind[i]==1)
 {
si=1;
while(c=getchar()==' ')getchar();
// getchar();//去掉第一個"
scanf("%s",sample);
// printf("%s\n",sample);
sample[strlen(sample)-1]='\0';//去掉第二個"
// printf("sample=%s\n",sample);
}
else
 {
si=0;
scanf("%s",sample);
// printf("sample=%s\n",sample);
val=atoi(sample);
 /**//* if(sample[0]=='-')
{
val=(-1)*(sample[1]-'0');
for(i=2;i<strlen(sample);i++)
{
val=val*10+sample[i]-'0';
}
}
else
{
for(i=0;i<strlen(sample);i++)
{
val=val*10+sample[i]-'0';
}
} */
}
break;
}
else if(c=='<')
 {
// printf("* %s *\n",str);
q=1;
si=0;
for(i=0;i<n;i++)
 {
if(strcmp(col[i],str)==0)
 {
cons=i;
break;
}
}
// cons=i;
scanf("%s",sample);
// printf("sample=%s\n",sample);
val=atoi(sample);
 /**//* if(sample[0]=='-')
{
val=(-1)*(sample[1]-'0');
for(i=2;i<strlen(sample);i++)
{
val=val*10+sample[i]-'0';
}
}
else
{
for(i=0;i<strlen(sample);i++)
{
val=val*10+sample[i]-'0';
}
} */
break;
}
else if(c=='>')
 {
// printf("* %s *\n",str);
q=2;
si=0;
for(i=0;i<n;i++)
 {
if(strcmp(col[i],str)==0)
 {
cons=i;
break;
}
}
// cons=i;
// printf("cons=%d\n",cons);
scanf("%s",sample);
// printf("sample=%s\n",sample);
val=atoi(sample);
 /**//* if(sample[0]=='-')
{
val=(-1)*(sample[1]-'0');
for(i=2;i<strlen(sample);i++)
{
val=val*10+sample[i]-'0';
}
}
else
{
for(i=0;i<strlen(sample);i++)
{
val=val*10+sample[i]-'0';
}
} */
break;
}
else if(c==' ')continue;
else
str[j++]=c;
}
// printf("val=%d\n",val);
// printf("sample=%s\n",sample);
// memset(res,0,sizeof(res));
// memset(ans,0x00,sizeof(ans));
nres=0;
if(!si)//限制條件是數字類型
 {
// printf("*");
if(q==0)
 {
for(i=0;i<m;i++)
 {
if(atoi(P[i][cons])==val)
 {
res[nres++]=i;
}
}
}
else if(q==1)
 {
for(i=0;i<m;i++)
 {
if(atoi(P[i][cons])<val)
 {
res[nres++]=i;
}
}
}
else if(q==2)
 {
for(i=0;i<m;i++)
 {
// printf("tmp=%d\n",atoi(P[i][cons]));
if(atoi(P[i][cons])>val)
 {
res[nres++]=i;
// printf("*\n");
}
}
}
}
else
 {
// printf("dd\n");
for(i=0;i<m;i++)
 {
if(strcmp(P[i][cons],sample)==0)
 {
res[nres++]=i;
// printf("res=%d\n",i);
}
}
}
// for(i=0;i<nres;i++)
// {
// printf("res=%d\n",res[i]);
// }
// memset(ans,0x00,sizeof(ans));
 /**//*------------------------------------------------------------------------
ans[0][0]='+';
width=0;
height=nres+4;
// printf("high=%d\n",height);
for(i=1;i<height-1;i++)
{
ans[i][0]='|';
}
ans[i][0]='+';
// for(i=0;i<height;i++)
// {
// for(j=0;j<1;j++)
// {
// printf("%c",ans[i][j]);
// }
// printf("\n");
// }
// break;
// printf("nres=%d\n",nres);
for(j=0;j<qry;j++)
{
// printf("width=%d\n",width);
maxl=strlen(col[id[j]]);//每格的寬度
// printf("maxl=%d\n",maxl);
for(i=0;i<nres;i++)
{
if(strlen(P[res[i]][id[j]])>maxl)maxl=strlen(P[res[i]][id[j]]);
}
maxl+=2;
// printf("maxl=%d\n",maxl);
// width+=maxl;
for(i=width+1;i<=width+maxl;i++)
{
ans[2][i]='-';
}
for(i=1;i<height-1;i++)
{
ans[i][width+maxl+1]='|';
}
for(i=width+1;i<=width+maxl;i++)
{
ans[1][i]=' ';
}
// printf("maxl=%d\nwidth=%d\n",maxl,width);
strcpy(&ans[1][width+(maxl-strlen(col[id[j]]))/2+1],col[id[j]]);
for(i=0;i<nres;i++)
{
for(h=width+1;h<width+maxl+1;h++)
{
ans[i+3][h]=' ';
}
strcpy(&ans[i+3][width+(maxl-strlen(P[res[i]][id[j]]))/2+1],P[res[i]][id[j]]);
}
width=width+maxl+1;
}
for(i=0;i<height;i++)
{
for(j=0;j<width;j++)
{
ans[i][j]=' ';
}
}
// printf("width=%d\n",width);
// printf("height=%d\n",height);
for(i=1;i<width;i++)
{
ans[0][i]='-';
ans[height-1][i]='-';
}
ans[0][width]='+';
ans[height-1][width]='+';
// for(i=0;i<m;i++)
// {
// for(j=0;j<n;j++)
// {
// printf("%s ",P[i][j]);
// }
// printf("\n");
// }
for(i=0;i<height;i++)
{
for(j=0;j<=width;j++)
{
printf("%c",ans[i][j]);
}
printf("\n");
}
------------------------------------------------------------------------*/
width=1;
// printf("qry=%d\n",qry);
for(i=0;i<qry;i++)
 {
maxdis[i]=strlen(col[id[i]]);
for(j=0;j<nres;j++)
 {
if(maxdis[i]<strlen(P[res[j]][id[i]]))
 {
maxdis[i]=strlen(P[res[j]][id[i]]);
}
}
maxdis[i]+=2;
// printf("dis=%d\n",maxdis[i]);
width+=maxdis[i]+1;
}
printf("+");
for(i=1;i<width-1;i++)
 {
printf("-");
}
printf("+\n");
printf("|");
for(i=0;i<qry;i++)
 {
for(j=0;j<(maxdis[i]-strlen(col[id[i]]))/2;j++)
 {
printf(" ");
}
printf("%s",col[id[i]]);
for(j=0;j<(maxdis[i]-strlen(col[id[i]])+1)/2;j++)
 {
printf(" ");
}
printf("|");
}
printf("\n");
printf("|");
for(i=0;i<qry;i++)
 {
for(j=0;j<maxdis[i];j++)
 {
printf("-");
}
printf("|");
}
printf("\n");
for(i=0;i<nres;i++)
 {
printf("|");
for(j=0;j<qry;j++)
 {
for(h=0;h<(maxdis[j]-strlen(P[res[i]][id[j]]))/2;h++)
 {
printf(" ");
}
printf("%s",P[res[i]][id[j]]);
for(h=0;h<(maxdis[j]-strlen(P[res[i]][id[j]]+1))/2;h++)
 {
printf(" ");
}
printf("|");
}
printf("\n");
}
printf("+");
for(i=1;i<width-1;i++)
 {
printf("-");
}
printf("+\n");
printf("\n");
}
// system("PAUSE");
return 0;
}



|