1. 程式人生 > 實用技巧 >【第19次CCF CSP認證】Markdown渲染器 (模擬)

【第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 }
View Code