当前位置: 代码迷 >> 综合 >> 【NOIP】【提高组】【p1098】【字符串的展开】
  详细解决方案

【NOIP】【提高组】【p1098】【字符串的展开】

热度:24   发布时间:2024-01-19 22:22:55.0

题目

代码

#include<iostream>
#include<string>
using namespace std;
int p1, p2, p3, offset = 0;
string ori, final, c, d;
int main(){cin >> p1 >> p2 >> p3;cin >> ori;final = ori;int size = ori.length();for(int i=0;i<size;i++){if(i!=0 && ori[i]=='-' && ori[i+1]!='-' && ori[i-1]!='-'){int a = (int)ori[i-1];int b = (int)ori[i+1];c = final.substr(0,i+offset);d = final.substr(i+1+offset, size);if(a<b){if(a<58 && b>96) continue;else if(b-a==1){final = c+d;}else{string e = "";if(p3==1){for(int i=a+1;i<b;i++){if(p1==1){for(int j=0;j<p2;j++){e += (char)i;} }else if(p1==2){for(int j=0;j<p2;j++){if(i>57) e += (char)(i-32);else e += (char)i;}    }else if(p1==3){for(int j=0;j<p2;j++){e += '*';}}}final = c + e + d;}else if(p3==2){for(int i=b-1;i>a;i--){if(p1==1){for(int j=0;j<p2;j++){e += (char)i;} }else if(p1==2){for(int j=0;j<p2;j++){if(i>57) e += (char)(i-32);else e += (char)i;}    }else if(p1==3){for(int j=0;j<p2;j++){e += '*';}}}final = c + e + d;}}offset += (b-a-1)*p2-1;}else if(a>=b){continue;}}}cout<<final;return 0;
}

就是一道很烦的模拟
一定要注意以下两点
1、"-"可能出现在第一个或最后一个,同时可能连续出现,用判断特殊处理
2、如果x-y中x为数字而y为字母,应选择不展开!(与题目中提及的特殊情况不重叠)
坑爹的数据
现场写的话我绝对玩完