CCF-202006-3-Markdown渲染器

题意:
给你文本宽度,以及一段文本。求最终被渲染的文本所占的行数。
题解:
首先将段落和项目列表求出,算出间隔的行数。然后加上渲染后的段落和项目所占的行数即可。如果用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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值