Codeforces Round #401 (Div. 2) D. Cloud of Hashtags(字符串 + 逆向思维)

D. Cloud of Hashtags

题意:

给你n个字符串,不能改变顺序,每个字符串可以选择从结尾删除连续的一段,使这n个字符串满足字典序从小到大的顺序。要求:删除的字符串尽量少。

题解:

  1. 最重要的一点:我们删除一个字符串的末尾,它一定比原来的字符串小。
  2. 我们正向删除的话,我们的前一操作会对后面的操作产生影响。我们不放逆向思考。
  3. 前一个字符串比后一个字符串大,我们将其一个个比较,并进行删除操作。

ACcode:

/*
 * @Author: NEFU_马家沟老三
 * @LastEditTime: 2020-09-30 19:05:27
 * @CSDN blog: https://blog.csdn.net/acm_durante
 * @E-mail: 1055323152@qq.com
 * @ProbTitle: 
 */
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i, a, n) for (int i = a; i <= n; i++)
#define per(i, a, n) for (int i = n; i >= a; i--)
#define lowbit(x) ((x) & -(x))
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
#define mem(a, b) memset(a, b, sizeof(a))
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const double PI = acos(-1.0);
const ll mod = 1e9 + 7;
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
template<class T>inline void read(T &res)
{
char c;T flag=1;
while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}
const int N = 500050;
string s[N];

void solve(int i,int j){
    int len1 = s[i].size(), len2 = s[j].size();
    for(int k = 1; k <= min(len1,len2); k++){
        if(s[i][k] < s[j][k]){
            s[j].erase(k);
            break;
        }
    }
}
int main()
{
    IOS
    int n;
    cin >> n;
    rep(i,1,n) cin >> s[i];
    for(int i= n; i >= 2; i--){
        int j = i - 1;//后比前大
        if(s[i] >= s[j]) continue;
        solve(i,j);
    }
    rep(i,1,n){
        cout << s[i]<< "\n";
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值