Official
C - Extra Character Editorial by kyopro_friends
\(S,T\) の文字を先頭から順に比較し、初めて異なった箇所が答えの \(1\) つです。
実装例(C++)
#include<bits/stdc++.h>
using namespace std;
int main(){
string S,T;
cin >> S >> T;
for(int i=0;i<S.size();i++){
if(S[i]!=T[i]){
cout << i+1 << endl;
return 0;
}
}
cout << S.size()+1 << endl;
}
このアルゴリズムの正当性は次のように証明できます。
\(S_i,T_i\) でそれぞれ \(S,T\) の \(i\) 番目の文字を表すことにします。
問題を「\(T\) から \(1\) 文字取り除いて \(S\) と一致させるのはどの文字を取り除けばよいか」と読み替えます。
\(p\) を、\(S_i\neq T_i\) となるような最小の \(i\) とします。
- 取り除く文字が \(p\) 番目より後ろであることはありません。( \(p\) 番目の文字が異なるままになるため)
- 取り除く文字が \(p\) 番目よりも前であると仮定し、\(q\) 番目とします。このとき、\(q\) によって定まる、S,Tの後ろの方の文字列の一致が、\(p\) に関しても言えるため、\(p\) も答えになることがわかります。(図参照)
以上により、正当性が示せました。
posted:
last update: