【第19次CCF CSP认证】Markdown渲染器 (模拟)
读题比较恶心,看到题目就不想写了(),手写了个逻辑理了半天。直接getline会有20分的点超时,手写读入过了,getchar大法好。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=10000010; 4 int myget(char *b){ 5 char ch=getchar(); 6 if(ch==EOF)return -1; 7 int i=0; 8 while(ch!='\n'&&ch!=EOF){ 9 *(b+i)=ch;++i; 10 ch=getchar(); 11 }return i; 12 }char a[21000000]; 13 int main(){ 14 //freopen("init2.txt","r",stdin); 15 int n,typ=0,lin=1,cnt=0,now=0,lonf=0; 16 int w;cin>>w;getchar(); 17 int num=0; 18 // 段落 1,项目 2,无类型0 19 while((n=myget(a))!=-1){ 20 ++num;//cout<<num<<endl; 21 int f=0; 22 for(int i=0;i<n;++i){ if(a[i]!=' '){ f=1;break; } } 23 //cout<<1<<' '<<lin<<' '<<cnt<<' '<<typ<<' '<<f<<endl; 24 if(!f){ 25 lonf=1; 26 continue; 27 } 28 if(a[0]=='*'&&a[1]==' '){ 29 if(lonf){ 30 if(now==1){typ=0;cnt=0;lin+=2;} 31 if(cnt!=0){cnt=0;++lin;} 32 if(typ!=0){typ=0;++lin;} 33 lonf=0; 34 } 35 if(typ==2){if(cnt!=0||now==1)++lin;} 36 else if(typ==1){++lin; if(cnt!=0)++lin;} 37 typ=2; cnt=0; now=0; 38 int l=0,r=-1; 39 for(int i=2;i<n;++i)if(a[i]!=' '){l=i;break;} 40 for(int i=n-1;i>=2;--i)if(a[i]!=' '){r=i;break;} 41 if(r==-1)now=1; 42 for(int i=l;i<=r;++i){ 43 if(cnt==0&&a[i]==' ')continue; 44 if(cnt==0)cnt=3; 45 ++cnt; 46 if(cnt==w){cnt=0;++lin;} 47 } 48 } 49 else if(typ==2&&(!lonf)&&a[0]==' '&&a[1]==' '){ 50 int l=0,r=-1; 51 for(int i=2;i<n;++i)if(a[i]!=' '){l=i;break;} 52 for(int i=n-1;i>=2;--i)if(a[i]!=' '){r=i;break;} 53 if(cnt==w-1){++lin;cnt=0;} 54 else if(cnt!=0)++cnt; 55 for(int i=l;i<=r;++i){ 56 if(cnt==0&&a[i]==' ')continue; 57 if(cnt==0)cnt=3; 58 ++cnt; 59 if(cnt==w){cnt=0;++lin;} 60 } 61 } 62 else{ 63 if(lonf){ 64 if(now==1){typ=0;cnt=0;lin+=2;} 65 if(cnt!=0){cnt=0;++lin;} 66 if(typ!=0){typ=0;++lin;} 67 lonf=0; 68 } 69 if(typ==1){ 70 if(cnt==w-1){++lin;cnt=0;} 71 else if(cnt!=0)++cnt; 72 } 73 else if(typ==0)typ=1; 74 else{ if(cnt!=0||now)++lin; ++lin;typ=1;cnt=0;} 75 int l=0,r=-1;now=0; 76 for(int i=0;i<n;++i)if(a[i]!=' '){l=i;break;} 77 for(int i=n-1;i>=0;--i)if(a[i]!=' '){r=i;break;} 78 for(int i=l;i<=r;++i){ 79 if(cnt==0&&a[i]==' ')continue; 80 ++cnt; 81 if(cnt==w){cnt=0;++lin;} 82 } 83 } //cout<<2<<' '<<lin<<' '<<cnt<<' '<<typ<<endl; 84 } 85 if(cnt==0&&!now)--lin; 86 cout<<lin<<endl; 87 return 0; 88 }