信息学奥赛一本通 1848:【07NOIP提高组】字符串的展开 | OpenJudge NOI 1.7 35:字符串的展开 | 洛谷 P1098 [NOIP2007 提高组] 字符串的展开
生活随笔
收集整理的這篇文章主要介紹了
信息学奥赛一本通 1848:【07NOIP提高组】字符串的展开 | OpenJudge NOI 1.7 35:字符串的展开 | 洛谷 P1098 [NOIP2007 提高组] 字符串的展开
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【題目鏈接】
ybt 1848:【07NOIP提高組】字符串的展開
OpenJudge NOI 1.7 35:字符串的展開
洛谷 P1098 [NOIP2007 提高組] 字符串的展開
【題目考點(diǎn)】
1. 模擬
2. 字符串
【解題思路】
解法1:使用string類
復(fù)雜的模擬題建議使用string類來做。
設(shè)結(jié)果字符串s_ans
遍歷字符串,遇到減號(hào)就做展開。
- 確定減號(hào)左右兩側(cè)的字符
- 設(shè)展開所產(chǎn)生的字符串s_ins,根據(jù)左右兩側(cè)的字符得知要添加的各個(gè)字符。
- 根據(jù)p1對(duì)要添加的字符做處理,將該字符添加p2個(gè)。
- 如果p3為2,那么再將s_ins反序。
- 最后將s_ins接在s_ans后面
如果沒有遇到減號(hào),那么直接將當(dāng)前遍歷到的字符接在s_ans后面
最后輸出s_ans
解法2:使用字符數(shù)組
整體思路與解法1相同。
- 數(shù)組長(zhǎng)度:考慮極端情況,長(zhǎng)為100的字符串中有50個(gè)減號(hào),都能展開每個(gè)展開都是a~z,每個(gè)字母最多8個(gè)(已知p2<=8)粗略估算結(jié)果最多有24?8?50+50=965024*8*50+50=965024?8?50+50=9650,數(shù)組長(zhǎng)度取10000即可。
- 字符數(shù)組末尾添加字符:使用數(shù)組填充寫法。設(shè)字符數(shù)組s當(dāng)前長(zhǎng)度為len,要添加字符c:s[len++] = c;
【題解代碼】
解法1:使用string類, <cctype>函數(shù)
#include<bits/stdc++.h> using namespace std; int main() {int p1, p2, p3;string s, s_ans;//s_ans:結(jié)果字符串 char lc, rc;cin >> p1 >> p2 >> p3;cin >> s;s_ans.push_back(s[0]);for(int i = 1; i < s.length(); ++i)//第0位置不看了,有減號(hào)也無(wú)法展開 {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)//每個(gè)字符填充p2個(gè) {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:使用字符數(shù)組,自己寫函數(shù)做判斷
#include<bits/stdc++.h> using namespace std; #define N 10000 int p1, p2, p3, l_a, l_i;//l_a:s_ans的長(zhǎng)度 l_i:ins字符串的長(zhǎng)度 char s[N], s_ans[N], s_ins[N];//ans:結(jié)果字符串 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位置不看了,有減號(hào)也無(wú)法展開 {if(s[i] == '-'){l_i = 0;//s_ins字符串的長(zhǎng)度 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)//每個(gè)字符填充p2個(gè) {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; }總結(jié)
以上是生活随笔為你收集整理的信息学奥赛一本通 1848:【07NOIP提高组】字符串的展开 | OpenJudge NOI 1.7 35:字符串的展开 | 洛谷 P1098 [NOIP2007 提高组] 字符串的展开的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3安装模块的命令_如何为Py
- 下一篇: 为什么vsdebug没有生成obj文件_