这题正着来做很麻烦
这 么 想 , 删 掉 后 缀 后 , 字 符 串 的 字 典 序 只 减 不 增 这么想,删掉后缀后,字符串的字典序只减不增 这么想,删掉后缀后,字符串的字典序只减不增
所 以 , 第 n 个 字 符 串 一 定 不 会 删 后 缀 所以,第n个字符串一定不会删后缀 所以,第n个字符串一定不会删后缀
那 么 检 查 第 n − 1 个 后 缀 , 删 掉 一 些 让 它 小 于 等 于 第 n 个 字 符 串 那么检查第n-1个后缀,删掉一些让它小于等于第n个字符串 那么检查第n−1个后缀,删掉一些让它小于等于第n个字符串
以 此 类 推 . . . . . . . . . 以此类推......... 以此类推.........
#include <bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
string s[maxn];
int n;
void run(int q,int w)
{
//保证s[q]>=s[w]
//因为s[q]应该比较大,所以是去删掉s[w]的一些后缀
if(s[q]>=s[w]) return;//字典序大于等于,满足条件了
int len1=s[w].length(),len2=s[q].length();
for(int i=0;i<len1;i++)
if(s[w][i]>s[q][i])
{
s[w].erase(i,len1-i);
return;
}
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> n;
for(int i=1;i<=n;i++) cin >> s[i];
for(int i=n;i>=2;i--) run(i,i-1);
for(int i=1;i<=n;i++) cout<<s[i]<<"\n";
}