#include <string>
#include <map>
#include <iostream>
using namespace std;
int counter = 0;
int match(char c1, char c2){
return c1 == c2 ? 0 : 1;
}
int edit_distance(string s1, string s2,map<pair<string,string>, int>& memo){
if(memo[make_pair(s1,s2)])
return memo[make_pair(s1,s2)];
int i = s1.size();
int j = s2.size();
if(s1.empty())
return memo[make_pair(s1,s2)] = 1 + j;
if(s2.empty())
return memo[make_pair(s1,s2)] = 1 + i;
int opt[3];
opt[0] = edit_distance(s1.substr(1), s2.substr(1),memo) + match(s1[0],s2[0]);
opt[1] = edit_distance(s1.substr(1), s2,memo) + 1;
opt[2] = edit_distance(s1, s2.substr(1),memo) + 1;
int min = opt[0];
for(int i = 1; i < 3; i++){
if(opt[i] < min)
min = opt[i];
}
memo[ make_pair(s1,s2) ] = min;
return min;
}
int edit_distance_driver(string s1, string s2){
map<pair<string,string>,int> memo;
return edit_distance(s1, s2, memo);
}
int main(){
cout << edit_distance_driver("thou shalt not","you should not") << endl;
return 0;
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKaW50IGNvdW50ZXIgPSAwOwoKaW50IG1hdGNoKGNoYXIgYzEsIGNoYXIgYzIpewogIHJldHVybiBjMSA9PSBjMiA/IDAgOiAxOwp9CgppbnQgZWRpdF9kaXN0YW5jZShzdHJpbmcgczEsIHN0cmluZyBzMixtYXA8cGFpcjxzdHJpbmcsc3RyaW5nPiwgaW50PiYgbWVtbyl7CiAgaWYobWVtb1ttYWtlX3BhaXIoczEsczIpXSkKICAgIHJldHVybiBtZW1vW21ha2VfcGFpcihzMSxzMildOwogIGludCBpID0gczEuc2l6ZSgpOwogIGludCBqID0gczIuc2l6ZSgpOwoKICBpZihzMS5lbXB0eSgpKQogICAgcmV0dXJuIG1lbW9bbWFrZV9wYWlyKHMxLHMyKV0gPSAxICsgajsKICBpZihzMi5lbXB0eSgpKQogICAgcmV0dXJuIG1lbW9bbWFrZV9wYWlyKHMxLHMyKV0gPSAxICsgaTsKCiAgaW50IG9wdFszXTsKCiAgb3B0WzBdID0gZWRpdF9kaXN0YW5jZShzMS5zdWJzdHIoMSksIHMyLnN1YnN0cigxKSxtZW1vKSArIG1hdGNoKHMxWzBdLHMyWzBdKTsKICBvcHRbMV0gPSBlZGl0X2Rpc3RhbmNlKHMxLnN1YnN0cigxKSwgczIsbWVtbykgKyAxOwogIG9wdFsyXSA9IGVkaXRfZGlzdGFuY2UoczEsIHMyLnN1YnN0cigxKSxtZW1vKSArIDE7CgogIGludCBtaW4gPSBvcHRbMF07CiAgZm9yKGludCBpID0gMTsgaSA8IDM7IGkrKyl7CiAgICBpZihvcHRbaV0gPCBtaW4pCiAgICAgIG1pbiA9IG9wdFtpXTsKICB9CiAgbWVtb1sgbWFrZV9wYWlyKHMxLHMyKSBdID0gbWluOwogIHJldHVybiBtaW47Cn0KCmludCBlZGl0X2Rpc3RhbmNlX2RyaXZlcihzdHJpbmcgczEsIHN0cmluZyBzMil7CiAgbWFwPHBhaXI8c3RyaW5nLHN0cmluZz4saW50PiBtZW1vOwogIHJldHVybiBlZGl0X2Rpc3RhbmNlKHMxLCBzMiwgbWVtbyk7Cn0KCmludCBtYWluKCl7CiAgY291dCA8PCBlZGl0X2Rpc3RhbmNlX2RyaXZlcigidGhvdSBzaGFsdCBub3QiLCJ5b3Ugc2hvdWxkIG5vdCIpIDw8IGVuZGw7CiAgcmV0dXJuIDA7Cn0K