• Automatic Editing题解


    7月28的考试题鸭

    大致翻译(可能不太准,但题意一样,至少我过了)

    问题描述: 为了对一些资料进行保密,奶牛们要对某些文章进行编辑。编辑的方法很奇特:要把原有文章 的某些词句按照某些规则用另 规则的形式如下:原串 新串,表示把原串替换成 新串。

    假设有 n 条规则,第 i 规则的原串和 新串分别为 Mi 和 Ni,则编辑按如下过程进行:

    开始编辑时,先使用第一条规则,把文章中出现的 第一个 M1 替换成 N1,如果替换后的新文章还存在 M1,则如上处理,直到文章不存在 M1 为止;

    然后用同样的方法使用第 2,第 3,……,第 n 条 规则进行替换,直到所有的规则都用完为止。

    注意: 1、 每次都要从文章开头开始找要替换的词句 2、一条规则一旦使用完后,将不能再使用 3、 每一篇文章都是可编辑的 如有四条规则:

    ban——>bab(1)

    baba——>be(2)

    ana——>any(3)

    ba b——>hind the g(4)

    要编辑的文章为“banana boat ,则编辑的过程如下: 编辑顺序 编辑前的文章 编辑后的文章 使用的规则:

    banana boat——>babana boat (1)

    babana boat——>bababa boat (1)

    bababa boat——>beba boat (2)

    (第三个规则没用到)

    beba boat——>behind the goat (4)

    编辑后的文章为“behind the goat”。请编写一程序,帮助组委会对给定的文章进行编辑。 输入格式:

    可能有一组到多组数据,每组共有 2n+2 行。第一行是一个整数 n(1<=n<=10),表示规则的数目;接下来第 2i行及第 2i+1 行分别表示 Mi 和 Ni(1<=i<=n),其长度均不超过 80 个字符,且 Mi 不为空串;最 后一 行是要编辑的文章,长度不超过 80 个字符。行末没有空格。读入到0时截止

    输出格式: 文件只有一行,表示编辑后的文章(长度不超过 80 个字符)。行末也应该没有空格。

    蒟蒻动手写的第一篇题解hhhh

    作为第一个在洛谷通过这道题的人!!!虽然找了无数大佬

    好吧我们进入正文:

    这道题其实不难,纯模拟无算法,数据也小能暴力,但最重要的就是要注意细节鸭。

    优化可以用链表,但我太懒了就算了吧

    PPPPPPPPS:

    不要问我为什么我的输入是这个亚子的奇怪,因为这道题就是卡你的输入输出xixi

    话不多说,代码里详细解释:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 int n=1;
     5 char first[50001],rule[105][3][201];//数组不用开这么大,但我刚开始出现了RE  xixi 
     6 
     7 int main()
     8 {
     9     //freopen("editing.in","r",stdin);
    10     //freopen("editing.out","w",stdout);
    11     while(n!=0)//程序结束的条件 
    12     {
    13         scanf("%d",&n);
    14         getchar();//不要问我为什么!!! 
    15         if(n==0)
    16             return 0;
    17         for(int i=1;i<=n;i++)
    18         {
    19             scanf("%[^
    ]",rule[i][0]),getchar();//相当于题目中m[i] 
    20             scanf("%[^
    ]",rule[i][1]),getchar();//n[i] 
    21         }
    22         scanf("%[^
    ]",first);
    23         getchar();//同上 
    24         for(int i=1;i<=n;i++)//n条规则 
    25         {
    26             int iff=1;//用iff表示第i条规则是否还要“继续判断”使用 
    27             while(iff)
    28             {
    29                 iff=0;
    30                 //进入while后,先定义iff为0防止跑到停不下来 
    31                 int len=strlen(first),l=strlen(rule[i][0]);
    32                 for(int j=0;j+l-1<len;j++)//循环,找与规则[i]相同的数组,注意长度 
    33                 {
    34                     int flag=1;//用flag表示第i 条规则“能否”使用 
    35                     for(int k=j;k<=j+l-1;k++)
    36                     {
    37                         if(first[k]!=rule[i][0][k-j])
    38                         {
    39                             flag=0;//若有一个字符不同则不能使用这一条规则 
    40                             break;
    41                         }
    42                     }
    43                     if(flag)//修改 
    44                     {
    45                         //注意rule[i][1]与rule[i][0]的长度可能不同
    46                         //所以要将修改后位置不对的字符移动(应该能看懂) 
    47                         if(strlen(rule[i][1])>=l)
    48                         {
    49                             int w=strlen(rule[i][1])-l;
    50                             if(w)
    51                                 for(int p=len-1;p>j+l-1;p--)
    52                                     first[p+w]=first[p];
    53                             for(int p=0;p<strlen(rule[i][1]);p++)
    54                                 first[j+p]=rule[i][1][p];
    55                         }
    56                         else
    57                         {
    58                             int w=-strlen(rule[i][1])+l;
    59                             for(int p=j+l;p<=len-1;p++)
    60                                 first[p-w]=first[p];
    61                             for(int p=0;p<strlen(rule[i][1]);p++)
    62                                 first[j+p]=rule[i][1][p];
    63                             for(int p=1;p<=w;p++)
    64                                 first[len-p]='';//后面多出的字符定义为‘’,不然会导致输出错误 
    65                         }
    66                         iff=1;
    67                         //如果本次能修改就要判断下次能否修改
    68                         //如果本次不能修改则表示这条规则不能再使用(因为循环是跑到底的) 
    69                         break;
    70                     }
    71                 }
    72             }
    73         }
    74         printf("%s
    ",first);
    75         memset(first,'',sizeof(first));
    76         memset(rule,'',sizeof(first));//因为有多组数据所以要初始化 
    77     }
    78     return 0;//完美结束(大呼爽快) 
    79 }

    PPPPPPPPPPPPPS+1:

    关于scanf的这个奇怪还很丑的用法呢,介个还是粗略讲下吧。

    在"%"后连接上的中括号中,可以写上输入的范围(输入到不是范围的字符就会退出输出),举个栗子,%[a-z]是范围设为小写字母,%[^(1-9)]表示不输入1~9这个区间内的字符(^可以理解为不取嘛)。

    所以"%[^ ]"的用法就是不输入换行啦(而且可以输入空格!!!)

    结束!

    PPPPPPPPPPPPPS+2:

    这道题其实不难,个人认为在黄题左右(其实我也不确定,个人感觉)

    但就是因为输入输出,我调了一下午加半个晚自习(调到脑袋爆炸)

    PPPPPPPPPPPPPS+3:

    感谢dalao的帮助 hyc

  • 相关阅读:
    docker安装redis
    Kibana:Vega 可视化入门
    QT
    软件版本
    vue在线预览pdf
    Nacos 架构原理①:一条注册请求会经历什么?
    验证码是自动化的天敌?看看大神是怎么解决的
    Allure在自动化测试中的应用
    测试架构师必备技能Nginx安装部署实战
    一文学会jenkins pipline自动化构建
  • 原文地址:https://www.cnblogs.com/Yz-jw/p/11264166.html
Copyright © 2020-2023  润新知