D. Cloud of Hashtags
题意:
1.给你
n
串字符串,都是以#
开头。
2.让你删除掉最少的一些字符,从而形成
思路:
1.贪心策略:从后往前推,即是形成字典序不递增的字符串,这样可以使得保留最多,即删除最少。
2.每次计算,只与后一列有关系。
3.直接比对模拟取子串就行了。
代码:
#include <bits/stdc++.h>
using namespace std;
char s[500500];
string buf[500500];
char minn[500500];
string scf() {
scanf("%s", &s);
return s;
}
int main() {
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++) buf[i] = scf();
for(int i = 0; i < buf[n-1].size(); i++) minn[i] = buf[n-1][i];
int idx = buf[n-1].size();
for(int i = n-2; i >= 0; i--) {
string tp = buf[i];
tp = tp.substr(0, idx);
int to = min(idx, (int)tp.size());
for(int j = 0; j < to; j++) {
if(tp[j] < minn[j]) {
minn[j] = tp[j];
tp = buf[i];
for(int k = j; k < tp.size(); k++) minn[k] = tp[k];
break;
} else if(tp[j] > minn[j]) {
tp = tp.substr(0, j);
break;
}
}
idx = tp.size();
buf[i] = tp;
}
for(int i = 0; i < n; i++) cout << buf[i] << endl;
}