字符串的展开

原题链接: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 }

 

 

 

原文地址:https://www.cnblogs.com/OIerShawnZhou/p/7487676.html