• Codeforces Round #401 (Div. 2) D Cloud of Hashtags —— 字符串


    题目链接:http://codeforces.com/contest/777/problem/D


    题解:

    题意:给出n行字符串,对其进行字典序剪辑。我自己的想法是正向剪辑的,即先对第一第二个字符串进行剪辑,但是这样却不能保证前面的操作是正确的,当后面突然出现一个字典序很小的字符串,那么前面的操作将非法。这种方法错在不能预知正在操作的字符串的字典序限度。看了别人的代码,发现是反向进行剪辑的,即从倒数第一第二个字符串进行剪辑,直到第一个。因为倒数第一个的字典序必须是最大,所以倒数第二个的字典序限度已知,所以可直接对其操作,并能保证操作时合法的,即在字典序限度之内,以此类推,直到第一个字符串。其实这是一个贪心过程,每一步都是最优的。

     


    学习之处:

    1.由于字符串的长度不确定,即无法预知其大小,所以用传统的数组行不通。后来想到用string(之前只是有过了解,但没有用过),即解决了字符串长度的问题。string只能用cin和cout输入输出,string初始长度为0,如果要直接赋值,只能对长度之内的元素赋值。可直接+ 和 =。 输出时遇到不会停止输出,而是输出所有的元素。


     


    代码如下:

     1 #include<bits/stdc++.h>  
     2 using namespace std;  
     3   
     4 string a[500005],tmp;  
     5 int main()  
     6 {  
     7     int n;  
     8     scanf("%d",&n);  
     9   
    10     for(int i = 0; i<n; i++)  
    11         cin>>a[i];  
    12   
    13     for(int i = n-2; i>=0; i--)  
    14     {  
    15         int len = a[i].size();  
    16         tmp = "";  
    17         for(int j = 0; j<len; j++)  
    18         {  
    19             if(a[i][j]>a[i+1][j])  
    20             {  
    21                 a[i] = tmp;  
    22                 break;  
    23             }  
    24   
    25             else if(a[i][j]<a[i+1][j])  
    26             {  
    27                 for(int k = j; k<len; k++) tmp += a[i][k];  
    28                 a[i] = tmp;  
    29                 break;  
    30             }  
    31             else if(a[i][j]==a[i+1][j]) tmp += a[i][j];  
    32         }  
    33     }  
    34   
    35     for(int i = 0; i<n; i++)  
    36         cout<<a[i]<<endl;  
    37 }  
    View Code

     

  • 相关阅读:
    jQuery 选择器
    Linux vs Window
    Git是什么?
    JS三大经典变量命名法
    常用html、CSS、javascript前端命名规范
    Ajax中Get请求与Post请求的区别
    HTTP 请求方式: GET和POST的比较
    poj2195 Going Home
    bzoj1059 [ZJOI2007]矩阵游戏
    bzoj1191 [HNOI2006]超级英雄Hero
  • 原文地址:https://www.cnblogs.com/DOLFAMINGO/p/7538769.html
Copyright © 2020-2023  润新知