日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

CSP认证201703-3Markdown[C++题解]:字符串处理、模拟

發布時間:2025/4/5 c/c++ 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CSP认证201703-3Markdown[C++题解]:字符串处理、模拟 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

      • 題目解答
      • 題目鏈接

題目解答




來源:acwing

分析:

這是一道模擬題,但是比較復雜。需要思維建模。

值得注意的點有:

  • 用vector來存每一行,包括空行也占vector的一格;然后怎么判斷vector 的某行為空?直接strs[i].empty()就可以判斷strs這個vector的第i行是否為空。這樣就可以找到讀入的空行。
  • 從大到小建模。先是處理一段(空行隔開的連續幾行)。這時候單獨寫一個函數處理這一段,傳入的參數是開始的行數和結束的行數。比如work(int a, int b);處理的就是第a行到第b行。
  • 在這個處理每一段函數的內部,要細分。對這一段進行判斷,它是標題,還是列表,還是普通的段落,寫了3個if-else來進行判斷。然后要抽象出來一部分東西,比如如何輸出一行?是在哪部分都需要的。這里寫一個函數print_line(string str);輸出這一行。
  • 對于輸出一行的函數內部,我們要細分。首先比如讀入”#“,后面會跟著空格,所以第一步是清除這些空格。然后開始處理。每一行中可能會遇到兩種情況:一是強調(以 _ 開頭,稱為起始位置),二是鏈接(以 [ 開頭,稱為起始位置)。單獨寫兩個函數進行處理:print_em(string str, int i) 和 print_link(string str, int i )。其中每個函數的第二個參數i表示強調或者鏈接的起始位置在在哪兒。函數返回的是強調或者鏈接的結束位置在哪兒。
  • 需要注意的是,鏈接和強調可能嵌套,所有要分別處理之。
  • ac代碼

    #include<bits/stdc++.h> using namespace std; vector<string> strs;// 處理鏈接 int print_link(string str, int i){string text, link;for( i ++; str[i] != ']'; i ++){char c = str[i];if(c == '_'){text += "<em>";i ++;while(str[i] != '_') text += str[i ++];text += "</em>";}else{text += c;}}// 處理鏈接for(i += 2; str[i] != ')'; i++){link += str[i];}printf("<a href=\"%s\">%s</a>", link.c_str(), text.c_str());return i; }// 處理強調 int print_em(string str, int i){printf("<em>");for(i ++; str[i] != '_'; i++){char c = str[i];if( c == '[') i = print_link(str, i);else cout << c;}printf("</em>");return i; } // 輸出一行 void print_line(string str){// 將前面的空格刪掉int k = 0;while(str[k] == ' ') k++;str = str.substr(k);for(int i= 0; i < str.size(); i ++){char c = str[i];if(c == '_') i = print_em(str, i); // 處理強調else if( c == '[') i = print_link(str, i); // 處理鏈接else cout << c; // 直接輸出} }// 處理a行到b行這一段 void work(int a, int b){//判斷標題if(strs[a][0] == '#'){int k = 0;while(strs[a][k] == '#') k++;printf("<h%d>",k);print_line(strs[a].substr(k));// 處理一行printf("</h%d>\n",k);}else if(strs[a][0] == '*'){printf("<ul>\n");for(int i = a; i <= b; i ++){printf("<li>");print_line(strs[i].substr(1)); //處理一行printf("</li>\n");}printf("</ul>\n");}//段落else{printf("<p>");for(int i = a; i <= b; i ++){print_line(strs[i]); // 處理一行if(i != b) cout << endl;}printf("</p>\n");} }int main(){string str;while(getline(cin, str)) strs.push_back(str);for(int i = 0; i < strs.size(); i ++){//跳過空行if(strs[i].empty()) continue;// 第i行不空的情況// 找到一段int j = i + 1;while(j < strs.size() && strs[j].size()) j ++;work(i, j - 1); // 處理第i行到第j-1行這一段i = j -1; // 處理完后,跳過這一段}}

    題目鏈接

    https://www.acwing.com/problem/content/3247/

    總結

    以上是生活随笔為你收集整理的CSP认证201703-3Markdown[C++题解]:字符串处理、模拟的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。