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

题解:

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

学习之处:

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

代码如下:

 #include<bits/stdc++.h>
using namespace std; string a[],tmp;
int main()
{
int n;
scanf("%d",&n); for(int i = ; i<n; i++)
cin>>a[i]; for(int i = n-; i>=; i--)
{
int len = a[i].size();
tmp = "";
for(int j = ; j<len; j++)
{
if(a[i][j]>a[i+][j])
{
a[i] = tmp;
break;
} else if(a[i][j]<a[i+][j])
{
for(int k = j; k<len; k++) tmp += a[i][k];
a[i] = tmp;
break;
}
else if(a[i][j]==a[i+][j]) tmp += a[i][j];
}
} for(int i = ; i<n; i++)
cout<<a[i]<<endl;
}

最新文章

  1. Xamarin 编程之打电话
  2. SQLServer 脚本测试
  3. Chromium的GPU进程启动流程
  4. 慕课网-安卓工程师初养成-4-3 Java条件语句之多重 if
  5. 写自己的WPF样式 - 按钮
  6. windows系统操作类和演示程序(关机,关闭显示器,打开屏幕保护程序,打开光驱等)
  7. Linux 环境进程间通信(六):
  8. Android PopupWindow的使用技巧(转)
  9. python打印万年历
  10. awk知识点全回顾
  11. jqueryui sortable拖拽后保存位置
  12. spring ioc(反转控制)
  13. 根据class判断
  14. 安装SQL Server For Linux(Install SQL Server)
  15. element中使用button会刷新一遍页面
  16. OO——电梯作业总结
  17. 使用第三方控件DotNetBar来美化程序
  18. bzoj 1318 [SPOJ744] Longest Permutation (排列)
  19. [C#]读文件
  20. 哈弗曼树的理解和实现(Java)

热门文章

  1. 洛谷——P2527 [SHOI2001]Panda的烦恼
  2. c实现的trim函数
  3. PhantomJS 基础及示例 (转)
  4. C#中通过反射获取类中非公有成员
  5. 千呼万唤始出来:ArchLinux for Espressobin
  6. javascript变量初始化位置
  7. leetCode(40):Path Sum
  8. POJ 3469(Dual Core CPU-最小割)[Template:网络流dinic V2]
  9. Lombok简介
  10. 事件总线EventBus