一道思维水题,但是我做的时候,tle了。。。
之前的思路是从后往前一个一个比较字符串的字串,很明显超时,但是没有注意到。。。
题解:
因为字符的总个数不会超过500000,所以,可以从后往前一个一个比较字符,若相同,比较下一个,小于,比较下一个,大于,分两种情况:
1:前面的都相同,那么就把后面的都删去
2:前面的不全相同,那么后面的都加上
错误代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 500000 + 20;
int n;
string s[N];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> n;
for(int i = 0;i < n;++ i){
cin >> s[i];
s[i][0] = ' ';
}
for(int i = n-2;i >= 0;-- i){
string tmp = " ";
for(int j = 1;j < s[i].size();++ j){
if(tmp+s[i][j] <= s[i+1]){
tmp += s[i][j];
}
else
break;
}
s[i] = tmp;
}
for(int i = 0;i < n;++ i){
s[i][0] = '#';
cout << s[i] << endl;
}
}
ac代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 500000 + 20;
int n;
string s[N];
int main()
{
ios_base::sync_with_stdio(false);
cin >> n;
for(int i = 0;i < n;++ i){
cin >> s[i];
}
for(int i = n-2;i >= 0;-- i){
string tmp = "#";
bool ok = 1;
for(int j = 1;j < s[i].size();++ j){
if(j < s[i+1].size()){
if(s[i][j] < s[i+1][j])
ok = 0;
else if(s[i][j] > s[i+1][j]){
if(ok) break;
}
}
else{
if(ok) break;
}
tmp += s[i][j];
}
s[i] = tmp;
}
for(int i = 0;i < n;++ i)
cout << s[i] << endl;
}