3
void rangeOfChar(pair<int, int> startEnd[], string s, int visited[]) {6
for (int i = n - 1; i >= 0; i--) {7
auto asciiInd = s[i] - 'a';8
auto rangeInd = startEnd[asciiInd];10
if (rangeInd.first == i) {11
for (int j = 0; j < 26; j++) {12
auto rangeLookup = startEnd[j];13
if (rangeLookup.first != -1 && rangeLookup.first <= i &&14
rangeLookup.second >= rangeInd.first && rangeInd.second >= rangeLookup.second) {15
rangeInd.first = min(rangeLookup.first, rangeInd.first);16
rangeInd.second = max(rangeLookup.second, rangeInd.second);17
} else if (visited[j] != -1 && visited[j] < rangeInd.second) {18
rangeInd.first = min(rangeLookup.first, rangeInd.first);19
rangeInd.second = max(rangeLookup.second, rangeInd.second);24
startEnd[asciiInd] = rangeInd;28
vector<string> maxNumOfSubstrings(string s) {29
pair<int, int> startEnd[26];30
for (int i = 0; i < 26; i++) startEnd[i] = {-1, -1};32
memset(visited, -1, sizeof(visited));36
for (int i = 0; i < n; i++) {37
int charIndex = s[i] - 'a';38
if (startEnd[charIndex].first == -1) {39
startEnd[charIndex].first = i;41
startEnd[charIndex].second = i;44
rangeOfChar(startEnd, s, visited);48
for (int i = 0; i < n; i++) {49
if (startEnd[s[i] - 'a'].first < i) continue;50
auto range = startEnd[s[i] - 'a'];51
// cout<<range.first<<" "<<range.second<<" "<<s[i]<<endl;52
if (range.first == -1) continue;53
if (range.second < lastIndex) {56
lastIndex = range.second;57
ans.push_back(s.substr(range.first, range.second - range.first + 1));