CCF-201703-3

题目如下




解题思路
1.先处理行内的强调和超级链接
2.然后处理区块,用到了状态机思想(第一次切换状态的时候加前一状态的后缀和现在状态的前缀)
3.过了样例后只有60分,把写的函数全部不用了,一起写到主函数,突然就可以了,我就纳闷。还没找到原因,之后会持续更新的
4.反正我是做自闭了。可恶!
满分代码
#include<iostream>
#include<cstring>
using namespace std;
string t[7]={"0","1","2","3","4","5","6"};
int main(){
string line;
string temp="";
int sign=0;
int start,end;
while(getline(cin,line)){
while(line.find('_')!=line.npos){
start=line.find('_');
line.replace(start,1,"<em>");
end=line.find('_');
line.replace(end,1,"</em>");
}
while(line.find('[')!=line.npos){
start=line.find('[');
end=line.find(')');
string text=line.substr(start+1,line.find(']')-start-1);
string link=line.substr(line.find('(')+1,line.find(')')-line.find('(')-1);
line.replace(start,end-start+1,"<ahref=\""+link+"\">"+text+"</a>");
}
if(line==""){
if(sign==1){
temp+="</ul>\n";
sign=0;
}else
if(sign==2){
temp+="</p>\n";
sign=0;
}
}
else if(line[0]=='#'){
start=0;
end=line.find(" ");
temp+="<h"+t[end-start]+">"+line.substr(end+1)+"</h"+t[end-start]+">\n";
}
else if(line[0]=='*'){
if(sign==0){
temp+="<ul>\n";
sign=1;
}
temp+="<li>"+line.substr(2)+"</li>\n";
}else{
if(sign==0){
temp+="<p>"+line;
sign=2;
}
else if(sign==2){
temp+="\n"+line;
}
}
}
if(sign==1){
temp+="</ul>\n";
sign=0;
}
else if(sign==2){
temp+="</p>\n";
sign=0;
}
cout<<temp<<endl;
return 0;
}
