好吧,按照刘汝佳书上的说法,stringstream超级慢。。。。所以不想去用,但是老实说感觉用stringstream挺方便的,想了一想,sscanf也不是很好用,结果用了string,以及自己手写。
用了一个vector<string>,以及还有一些格式输出的问题,setw格式化,以及ios里面的位开关,还有读题的重要性。。不能有前缀后缀空格,总之在思维难度上比DP还是要简单很多。。。。放手去写就好了,一下是代码。
#include <string>
#include <iostream>
#include <vector>
#include <iterator>
#include <cctype>
#include <cstring>
#include <iomanip>
using namespace std;
vector<string> v[1005];
size_t words,num[1005],le,ri,line;
string str;
int main(){
ios_base::sync_with_stdio(false);
cout.setf(ios::left);
while(getline(cin,str)){
for(le=ri=0;ri<str.size();){
if(le==ri&&str[ri]==' ')
++le,++ri;
else if(le==ri&&isgraph(str[ri]))
++ri;
else if(str[ri]==' ')
v[line].push_back(string(str.begin()+le,str.begin()+ri)),le=ri;
else if(isgraph(str[ri]))
++ri;
}
if(le<str.size()&&isgraph(str[le]))
v[line].push_back(string(str.begin()+le,str.begin()+ri));
++line;
}
for(int i=0;i<line;++i)
words=max(words,v[i].size());
for(int i=0;i<line;++i)
for(int j=v[i].size()-1;j>=0;--j)
num[j]=max(num[j],v[i][j].size());
for(int i=0;i<line;++i){
for(int j=1;j<v[i].size()-1;++j)
cout<<setw(num[j]+1)<<v[i][j];
cout<<v[i].back()<<endl;
}
return 0;
}