CCF CSP201703-3MarkDown
思路:根据题目一种情况一种情况的解决,并根据测试用例分布慢慢设计得分
#include<iostream>
#include<vector>
using namespace std;
vector<string>V;\
//行内结构处理
void line(string &s){
int f1 = -1,f2 = -1;
//超链接
int f3 = -1, f4 = -1;
f1 = s.find('[');
if(f1 != -1) f2 = s.find(']', f1+1);
while(f1 != -1 && f2 != -1){
f3 = s.find('(', f2);
if(f3 != -1) f4 = s.find(')', f3+1);
if(f4 != -1 && f3 != -1){
string str = "<a href=\"" + s.substr(f3+1, f4-f3-1) + "\">"+ s.substr(f1+1, f2-f1-1) +"</a>";
s.erase(f1,f4-f1+1);
s.insert(f1,str);
}
f1 = s.find('[', f2);
if(f1 != -1) f2 = s.find(']', f1+1);
}
//强调
f1 = s.find('_');
if(f1 != -1) f2 = s.find('_', f1+1);
while(f1 != -1 && f2 != -1){
string str = "<em>" + s.substr(f1+1, f2-f1-1) + "</em>";
s.erase(f1,f2-f1+1);
s.insert(f1,str);
f1 = s.find('_', f1);
if(f1 != -1) f2 = s.find('_', f1+1);
}
}
int main(){
string s;
while(getline(cin,s)){
V.push_back(s);
}
for(int i = 0; i < V.size(); i++){
if(V[i].size() == 0) continue;
//分区块的情况
//列表
if(V[i][0] == '*'){
int j = 1;
//跳过空格
for(; j < V[i].size() && V[i][j] == ' '; j++){
}
V[i].erase(0,j);
line(V[i]);
V[i].insert(0,"<ul>\n<li>");
V[i].insert(V[i].size(),"</li>");
while(i+1 < V.size() && V[i+1][0] == '*'){
i++;
for(j = 1; j < V[i].size() && V[i][j] == ' '; j++){
}
V[i].erase(0,j);
line(V[i]);
V[i].insert(0,"<li>");
V[i].insert(V[i].size(),"</li>");
}
V[i].insert(V[i].size(),"\n</ul>");
}
//标题
else if(V[i][0] == '#'){
int num = 1;
int j = 1;
//计算#数量
for(; j < V[i].size() && V[i][j] == '#'; j++){
num++;
}
s = "";
while(num != 0){
s += num%10+'0';
num = num/10;
}
//跳过空格
for(; j < V[i].size() && V[i][j] == ' '; j++){
}
//只保留正文内容,并插入格式
V[i].erase(0,j);
line(V[i]);
V[i].insert(0,"<h"+s+">");
V[i].insert(V[i].size(),"</h"+s+">");
}
//段落
else if(V[i].size() != 0){
V[i].insert(0,"<p>");
while(i < V.size() && V[i].size() != 0){
line(V[i]);
i++;
}
V[i-1].insert(V[i-1].size(),"</p>");
}
}
for(int i = 0; i < V.size(); i++){
if(V[i].size()!=0) cout<<V[i]<<endl;
}
return 0;
}