字符串的展开
原题链接:https://www.luogu.org/problem/show?pid=1098#sub
从昨天晚上做,然后一直搞到现在,中午觉都没睡就为了调一个bug,但结果是,没调出来。
然后实在没办法了,按着题解的思路重构一遍代码,过了。
题意不难,让你以三个参数为参考展开一个被省略的字符串。
做法是扫描所有可能省略的位置,然后判断左边和右边的合法性,如果合法就按照规则展开。
在展开之前需要记录其左边和右边的串,需要一个offset变量记录偏移,因为每次串改变之后原串的长度应该是有变化的,每次单纯的从i那里分是不可以的。
仅供参考:
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 int p1, p2, p3, offset = 0; 5 string s, ed, sub1, sub2; 6 int main(){ 7 cin >> p1 >> p2 >> p3; 8 cin >> s; 9 ed = s; 10 int l = s.length(); 11 for(int i=0;i<l;i++){ 12 if(i!=0 && s[i]=='-' && s[i+1]!='-' && s[i-1]!='-'){ 13 int lpos = (int)s[i-1]; 14 int rpos = (int)s[i+1]; 15 sub1 = ed.substr(0,i+offset); 16 sub2 = ed.substr(i+1+offset, l); 17 if(lpos<rpos){ 18 if(lpos<58 && rpos>96) continue; 19 else if(rpos - lpos==1){ 20 ed = sub1+sub2; 21 } 22 else{ 23 string temp = ""; 24 if(p3==1){ 25 for(int i=lpos+1;i<rpos;i++){ 26 if(p1==1){ 27 for(int j=0;j<p2;j++){ 28 temp += (char)i; 29 } 30 } 31 else if(p1==2){ 32 for(int j=0;j<p2;j++){ 33 if(i>57) temp += (char)(i-32); 34 else temp += (char)i; 35 } 36 } 37 else if(p1==3){ 38 for(int j=0;j<p2;j++){ 39 temp += '*'; 40 } 41 } 42 } 43 ed = sub1 + temp + sub2; 44 } 45 else if(p3==2){ 46 for(int i=rpos-1;i>lpos;i--){ 47 if(p1==1){ 48 for(int j=0;j<p2;j++){ 49 temp += (char)i; 50 } 51 } 52 else if(p1==2){ 53 for(int j=0;j<p2;j++){ 54 if(i>57) temp += (char)(i-32); 55 else temp += (char)i; 56 } 57 } 58 else if(p1==3){ 59 for(int j=0;j<p2;j++){ 60 temp += '*'; 61 } 62 } 63 } 64 ed = sub1 + temp + sub2; 65 } 66 } 67 offset += (rpos-lpos-1)*p2-1; 68 } 69 else if(lpos>=rpos){ 70 continue; 71 } 72 } 73 } 74 cout << ed << endl; 75 return 0; 76 }
一切无法杀死我的,都将使我变得更加强大。