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: