2012年1月24日星期二

POJ 1750 Dictionary 模拟水题

这题目最后说的blank line number着实让人摸不着头脑,也就不管了。。。算法也没什么太多可以说的,就是做完之后发现这runtime 700+ms... = =!
网上有影射的code,发觉效率真的高不少啊,其实就是将for输出的blank用影射实现了,确实节省一定的时间。。。细节问题呢~总是想不到这种取巧的方法,是coding太少,还没有这意识吧...囧



#include<cstdio>
const int N = 100001,M = 11;
char list[N][M];


int main()
{
int i = 0,j = 0,total = 0;
while(scanf("%s",list[total]) != EOF)
total ++;
int blank = 0,substr = 0;
printf("%s\n",list[0]);
for(i = 1;i < total;i ++){
j = substr = 0;
while(list[i][j] != '\0'){      //control the space number whitout "0",TLE for this T_T
if(list[i][j] != list [i - 1][j])break;
else substr ++;
j ++;
}
if(substr > blank)blank ++;      //main algorithm
else blank = substr;
for(int k = 0;k < blank;k ++)
printf(" ");
printf("%s\n",list[i]);
}
return 0;
}



影射算法的code,输入上让我颇为不解,为嘛这种输入方式也可以呢??不是应该一次过全部输入以后再处理的么?可以一个一个的输入然后分别对比??或者在console上是不可以的,但是用ACM的文件流方式读入就是可以的吧?嗯嗯,这还说的过去。。。。这就可以节省不少内存了啊。。。
不过代码真的好简洁的说!特别是用gets输入和前缀自增与取模的混合应用上,还有比较表达式,学习了~



#include <iostream>
using namespace std;
char str[2][11] ;
char spaces[11][11] = { 
      "",
      " ", 
      "  ", 
      "   ", 
      "    ",
      "     ",
      "      ",
      "       ",
      "        ",
      "         ",
      "          "
     };
int  main()
{
 int forward = 0 , k=0 , i ;
 while ( gets(str[++k%2]) )
 {
  i = 0;
  while ( str[k%2][i] == str[(k+1)%2][i] && str[k%2][i] )  ++i; 
  forward = ( ++forward > i ?  i : forward ) ;
  printf("%s%s\n",spaces[forward],str[k%2]);
 }
 return 0;
}

没有评论:

发表评论