题意:
给你文本宽度,以及一段文本。求最终被渲染的文本所占的行数。
题解:
首先将段落和项目列表求出,算出间隔的行数。然后加上渲染后的段落和项目所占的行数即可。如果用string注意关闭同步流,以及输入方式。
代码如下:
#include<bits/stdc++.h>
#define TLE ios::sync_with_stdio(0),cin.tie(0)
using namespace std;
const int maxn=21e6;
int W,n,ans;
vector<string>inputS;
vector<int>lenSA;
char tmpS[maxn];
typedef pair<int,int> pii;
int getId(int id){
int lenS;
lenS=lenSA[id];
if(lenS<2)return 3;
if(inputS[id][0]=='*'&&(inputS[id][1]==' '))return 1;
if(inputS[id][0]==' '&&(inputS[id][1]==' '))return 2;
return 3;
}
int dealBlank(){
int i,j,ret,kind,lenS,num;
string s;
ret=0;kind=0;
for (i=0;i<n;i++){
lenS=lenSA[i];j=0;
while(j<lenS&&(inputS[i][j]==' '))j++;
if(j>=lenS){
if(kind)ret++;
kind=0;
continue;
}
num=getId(i);
if(!kind){
if(num==1)kind=2;
else kind=1;
continue;
}
if(kind==1){
if(num==1)ret++,kind=2;
else if(num==2);
else if(num==3);
}
else if(kind==2){
if(num==1);
else if(num==2);
else if(num==3)ret++,kind=1;
}
}
if(kind)ret++;
return ret-1;
}
int dealPara(int Begin,int End){
int i,j,lenS,ret,l,r;
ret=0;lenS=0;
for (i=Begin;i<=End;i++){
l=0,r=lenSA[i]-1;
while(l<lenSA[i]&&(inputS[i][l]==' '))l++;
while(r>=l&&(inputS[i][r]==' '))r--;
if(i!=Begin)tmpS[lenS++]=' ';
if(l<=r){
for (j=l;j<=r;j++)tmpS[lenS++]=inputS[i][j];
}
}
i=0;
while(i<lenS){
while(i<lenS&&(tmpS[i]==' '))i++;
if(i>=lenS)break;
i+=W;ret++;
}
return ret;
}
int dealProject(int Begin,int End){
int i,j,l,r,lenS,ret;
ret=0;lenS=0;
for (i=Begin;i<=End;i++){
l=2,r=lenSA[i]-1;
while(l<lenSA[i]&&(inputS[i][l]==' '))l++;
while(r>=l&&(inputS[i][r]==' '))r--;
if(i!=Begin)tmpS[lenS++]=' ';
if(l<=r){
for (j=l;j<=r;j++)tmpS[lenS++]=inputS[i][j];
}
}
i=0;
do{
ret++;
while(i<lenS&&(tmpS[i]==' '))i++;
if(i>=lenS)break;
i+=(W-3);
}while(i<lenS);
return ret;
}
int main(){
TLE;
int i,j,kind,lenS,num;
string s;
pii dui;
cin>>W;
inputS.clear();lenSA.clear();ans=0;
while(getline(cin,s)){
///if(s=="END")break;
inputS.push_back(s);
}
n=inputS.size();
for (i=0;i<n;i++)lenSA.push_back(inputS[i].size());
ans+=dealBlank();
kind=0;dui.first=-1;dui.second=-1;
for (i=0;i<n;i++){
lenS=lenSA[i];j=0;
while(j<lenS&&(inputS[i][j]==' '))j++;
if(j>=lenS){
if((dui.first!=-1)&&(dui.second!=-1)){
if(kind==1)ans+=dealPara(dui.first,dui.second);
else if(kind==2)ans+=dealProject(dui.first,dui.second);
}
dui.first=-1;dui.second=-1;kind=0;
continue;
}
num=getId(i);
if(!kind){
if(num==1)kind=2;
else kind=1;
dui.first=i;dui.second=i;
}
else if(kind==1){
if(num==1){
dui.second=i-1;
if((dui.first!=-1)&&(dui.second!=-1)){
if(kind==1)ans+=dealPara(dui.first,dui.second);
else if(kind==2)ans+=dealProject(dui.first,dui.second);
}
dui.first=i;dui.second=i;
kind=2;
}
else if(num==2)dui.second=i;
else if(num==3)dui.second=i;
}
else if(kind==2){
if(num==1){
dui.second=i-1;
if((dui.first!=-1)&&(dui.second!=-1)){
if(kind==1)ans+=dealPara(dui.first,dui.second);
else if(kind==2)ans+=dealProject(dui.first,dui.second);
}
dui.first=i;dui.second=i;
kind=2;
}
else if(num==2)dui.second=i;
else if(num==3){
dui.second=i-1;
if((dui.first!=-1)&&(dui.second!=-1)){
if(kind==1)ans+=dealPara(dui.first,dui.second);
else if(kind==2)ans+=dealProject(dui.first,dui.second);
}
dui.first=i;dui.second=i;
kind=1;
}
}
}
if((dui.first!=-1)&&(dui.second!=-1)){
if(kind==1)ans+=dealPara(dui.first,dui.second);
else if(kind==2)ans+=dealProject(dui.first,dui.second);
}
cout<<ans<<endl;
return 0;
}