D. Cloud of Hashtags
题意:
给你n个字符串,不能改变顺序,每个字符串可以选择从结尾删除连续的一段,使这n个字符串满足字典序从小到大的顺序。要求:删除的字符串尽量少。
题解:
- 最重要的一点:我们删除一个字符串的末尾,它一定比原来的字符串小。
- 我们正向删除的话,我们的前一操作会对后面的操作产生影响。我们不放逆向思考。
- 前一个字符串比后一个字符串大,我们将其一个个比较,并进行删除操作。
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;
}