草体にぼ日記

だらだらと

AGC006A Prefix and Suffix

Prefix 意味 前に置くもの、接頭辞、敬称、
Suffix 末尾に転化したもの、接尾辞、添え字、拡張子
A - Prefix and Suffix



提出AC
Submission #8511255 - AtCoder Grand Contest 006

int main()
{
	cout <<setprecision(10);
	ll n ; 
	string s , t;
	cin >> n >> s >> t;
	int additional = n;
 
	int j = 0 ;
	for(int i = 0 ; i < n ; i ++){
		if(s[i] == t[j]){
			additional --;
			j++;
		}else{
			additional = n;
			j = 0;
			if(s[i] == t[j]){
				additional--;
				j++;
			}
		}
	}
	cout << n + additional << endl;
}

解法
やっていることは、sの前から順に、tの文字列と同じになっているものが何文字あるか、みたいなのを数えていった。
最小でも答えはn、でそれにn - 被ってる数 みたいな
s,tのサイズが同じだから添え字もエラーになることはないと思う。
(s,tの長さが違うとき、s[i](iはs.size()以上)をやったら、勝手に' 'とする。みたいなことをするんですかね?知らないけど)
汚いコードですね
そして何やってるかもよく分からん


良さげな解き方

int main()
{
	cout <<setprecision(10);
	int n , i ;
	string s ,t ;
	cin >> n >> s >> t;
 
	for(i = 0 ; i < n ; i++){
		if(s.substr(i,n-i)==t.substr(0,n-i)){
			break;
		}
	}
	cout << n + i << endl;
 
}

綺麗な解法
結局は、sの後ろの方が、tの前のほうと何文字被っているのかが大事
sについては後ろ側からn-i文字
tについては前からn-i文字を見る

(解説っぽい解答?)