这题目最后说的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;
}
没有评论:
发表评论