zoukankan      html  css  js  c++  java
  • 字符串的展开

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

     

     

     

  • 相关阅读:
    ECharts grid组件离容器的距离
    防火墙centos7执行 service iptables status报错问题完美解决
    linux 在切换用户时出现:命令提示符-bash-4.1$错误解决
    DataTable转为TXT文档
    读取ecxel中数据——NPOI.Excel和Aspose
    SQL连接数据库
    fiddler软件无法生成代码
    webapi发布后更新(无前台时)
    webapi日志记录(TXT存储)
    webapi使用Get进行访问时,url长度被限制解决办法
  • 原文地址:https://www.cnblogs.com/OIerShawnZhou/p/7487676.html
Copyright © 2011-2022 走看看