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

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


题解:


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


学习之处:

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



代码如下:

[cpp]  view plain  copy
  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. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值