信息学奥赛一本通 1848:【07NOIP提高组】字符串的展开 | OpenJudge NOI 1.7 35:字符串的展开 | 洛谷 P1098 [NOIP2007 提高组] 字符串的展开
生活随笔
收集整理的這篇文章主要介紹了
信息学奥赛一本通 1848:【07NOIP提高组】字符串的展开 | OpenJudge NOI 1.7 35:字符串的展开 | 洛谷 P1098 [NOIP2007 提高组] 字符串的展开
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目鏈接】
ybt 1848:【07NOIP提高組】字符串的展開
OpenJudge NOI 1.7 35:字符串的展開
洛谷 P1098 [NOIP2007 提高組] 字符串的展開
【題目考點】
1. 模擬
2. 字符串
【解題思路】
解法1:使用string類
復雜的模擬題建議使用string類來做。
設結果字符串s_ans
遍歷字符串,遇到減號就做展開。
- 確定減號左右兩側的字符
- 設展開所產生的字符串s_ins,根據左右兩側的字符得知要添加的各個字符。
- 根據p1對要添加的字符做處理,將該字符添加p2個。
- 如果p3為2,那么再將s_ins反序。
- 最后將s_ins接在s_ans后面
如果沒有遇到減號,那么直接將當前遍歷到的字符接在s_ans后面
最后輸出s_ans
解法2:使用字符數組
整體思路與解法1相同。
- 數組長度:考慮極端情況,長為100的字符串中有50個減號,都能展開每個展開都是a~z,每個字母最多8個(已知p2<=8)粗略估算結果最多有24?8?50+50=965024*8*50+50=965024?8?50+50=9650,數組長度取10000即可。
- 字符數組末尾添加字符:使用數組填充寫法。設字符數組s當前長度為len,要添加字符c:s[len++] = c;
【題解代碼】
解法1:使用string類, <cctype>函數
#include<bits/stdc++.h> using namespace std; int main() {int p1, p2, p3;string s, s_ans;//s_ans:結果字符串 char lc, rc;cin >> p1 >> p2 >> p3;cin >> s;s_ans.push_back(s[0]);for(int i = 1; i < s.length(); ++i)//第0位置不看了,有減號也無法展開 {if(s[i] == '-'){string s_ins;//要插入的字符串 lc = s[i-1];rc = s[i+1];if((islower(lc) && islower(rc) || isdigit(lc) && isdigit(rc)) && lc < rc){ for(char c = lc + 1; c <= rc - 1; ++c)//每次填充的字符c for(int j = 1; j <= p2; ++j)//每個字符填充p2個 {if(p1 == 3)s_ins.push_back('*');else if(isdigit(lc) || p1 == 1 && islower(lc))s_ins.push_back(c);else if(p1 == 2)s_ins.push_back(toupper(c));}if(p3 == 2)reverse(s_ins.begin(), s_ins.end());}elses_ins.push_back('-');s_ans += s_ins;//連接要插入的字符串 }elses_ans.push_back(s[i]);}cout << s_ans;return 0; }解法2:使用字符數組,自己寫函數做判斷
#include<bits/stdc++.h> using namespace std; #define N 10000 int p1, p2, p3, l_a, l_i;//l_a:s_ans的長度 l_i:ins字符串的長度 char s[N], s_ans[N], s_ins[N];//ans:結果字符串 ins:要插入的字符串 bool isLower(char c) {return c >= 'a' && c <= 'z'; } bool isDigit(char c) {return c >= '0' && c <= '9'; } int main() {char lc, rc;cin >> p1 >> p2 >> p3;cin >> s;s_ans[l_a++] = s[0];int len = strlen(s);for(int i = 1; i < len; ++i)//第0位置不看了,有減號也無法展開 {if(s[i] == '-'){l_i = 0;//s_ins字符串的長度 lc = s[i-1];rc = s[i+1];if((isLower(lc) && isLower(rc) || isDigit(lc) && isDigit(rc)) && lc < rc){ for(char c = lc + 1; c <= rc - 1; ++c)//每次填充的字符c for(int j = 1; j <= p2; ++j)//每個字符填充p2個 {if(p1 == 3)s_ins[l_i++] = '*';else if(isDigit(lc) || p1 == 1 && isLower(lc))s_ins[l_i++] = c;else if(p1 == 2)s_ins[l_i++] = c - 32;}if(p3 == 2)//倒序填充 {for(int j = l_i - 1; j >= 0; --j)s_ans[l_a++] = s_ins[j];}else//正序填充 {for(int j = 0; j < l_i; ++j)s_ans[l_a++] = s_ins[j];}}elses_ans[l_a++] = '-'; }elses_ans[l_a++] = s[i];}s_ans[l_a] = '\0';cout << s_ans;return 0; }總結
以上是生活随笔為你收集整理的信息学奥赛一本通 1848:【07NOIP提高组】字符串的展开 | OpenJudge NOI 1.7 35:字符串的展开 | 洛谷 P1098 [NOIP2007 提高组] 字符串的展开的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3安装模块的命令_如何为Py
- 下一篇: 判断是否是日期格式_Java8新特性之新