Official

D - "redocta".swap(i,i+1) Editorial by en_translator


Solution 1. Search

We can determine how many operations is needed at minimum to make \(S\) equal atcoder in manner of BFS, regarding the current string as a vertex.
During the implementation, it is useful to use a queue or a map (associative array).

The complexity is \(O(|S|!)\) (but this time, the complexity is constant because \(|S|\) is fixed to \(7\).)

Sample code (C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  string s;
  cin >> s;
  
  map<string,int> mp;
  queue<string> q;
  
  mp[s]=0;
  q.push(s);
  
  while(!q.empty()){
    string current=q.front();q.pop();
    if(current=="atcoder"){
      cout << mp[current] << "\n";
      return 0;
    }
    
    for(int i=1;i<7;i++){
      string next=current;
      swap(next[i-1],next[i]);
      if(mp.find(next)==mp.end()){
        q.push(next);
        mp[next]=mp[current]+1;
      }
    }
  }
  return 0;
}

Solution 2. Use the “inversion number”

Since atcoder consists of \(7\) distinct characters, we may consider replacing the \(i\)-th character of atcoder with an integer \(i\).
For example, an input catredo can be replaced with a sequence \((3,1,2,7,6,5,4)\).
What is the minimum number of swaps required to make the sequence equal \((1,2,3,4,5,6,7)\)? This is a famous problem called “inversion number.”
We do not explain the specific way to solve, but for example, Chokudai Speedrun 001-J is exactly the problem that asks to find the inversion number.
The time complexity is \(O(|S| \log |S|)\) (but just as before, \(|S|\) is fixed to \(7\), so this is a constant time too.)

Sample code (C++):

#include<bits/stdc++.h>

using namespace std;

vector<int> bit;
int sum(int i){
    int s=0;
    while(i>0){
        s+=bit[i];
        i-=i&(-i);
    }
    return s;
}

void add(int i,int x){
    while(i<bit.size()){
        bit[i]+=x;
        i+=i&(-i);
    }
}

int main(){
  bit.resize(10);
  for(int i=0;i<10;i++){bit[i]=0;}
  
  string s;
  cin >> s;
  map<char,int> mp;
  string atc="*atcoder";
  for(int i=1;i<=7;i++){
    mp[atc[i]]=i;
  }
  vector<int> a={-1};
  for(int i=0;i<7;i++){
    a.push_back(mp[s[i]]);
  }
  
  int res=0;
  for(int i=1;i<=7;i++){
    res+=(i-1-sum(a[i]));
    add(a[i],1);
  }
  cout << res << "\n";
  return 0;
}

posted:
last update: