zoukankan      html  css  js  c++  java
  • [CF777D] Cloud of Hashtags(贪心,二分)

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

    题意:n个字符串,保留前缀。希望保留尽可能多的字符,使得字典序单增。

    把n个字符串翻转过来,相当于字典序递减。比较相邻两个字符串的字典序大小,用二分将当前字符串截至恰好比上一个字符串字典序小,且最长即可。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int maxn = 500500;
     5 int n;
     6 string a[maxn], b[maxn];
     7 
     8 signed main() {
     9     // freopen("in", "r", stdin);
    10     while(~scanf("%d", &n)) {
    11         for(int i = n; i >= 1; i--) cin >> a[i];
    12         b[1] = a[1];
    13         for(int i = 2; i <= n; i++) {
    14             if(a[i] <= b[i-1]) {
    15                 b[i] = a[i];
    16                 continue;
    17             }
    18             int lo = 0, hi = a[i].length();
    19             string ret;
    20             while(lo <= hi) {
    21                 int mid = (lo + hi) >> 1;
    22                 if(a[i].substr(0, mid) <= b[i-1]) {
    23                     ret = a[i].substr(0, mid);
    24                     lo = mid + 1;
    25                 }
    26                 else hi = mid - 1;
    27             }
    28             b[i] = ret;
    29         }
    30         for(int i = n; i >= 1; i--) cout << b[i] << endl;
    31     }
    32     return 0;
    33 }
  • 相关阅读:
    Java面向对象知识点总结
    JAVA编程必学必会单词集(1)
    Linux 帮助命令
    学习笔记
    day4
    复习
    day5
    day04
    day3
    day02
  • 原文地址:https://www.cnblogs.com/kirai/p/7252514.html
Copyright © 2011-2022 走看看