Official

F - NewFolder(1) Editorial by kyopro_friends


\(L=10\) を文字列長の最大値とします。

問題文中の指示通りに毎回文字列を探すと、\(\Omega(N^2)\)の時間がかかりTLEしてしまいます。

連想配列を用いて、「いままでに \(S_i\) と同じ文字列を入力として何度受け取ったか」を覚えておくことで、\(1\) つあたり \(O(L\log N)\) 時間で出力すべき文字列を求めることができ、全体で \(O(NL\log N)\) 時間で問題を解くことができます。

実装例(C++)

#include<bits/stdc++.h>
using namespace std;

int main(){
	int n;
	cin >> n;
	map<string,int>cnt;
	for(int i=0;i<n;i++){
		string s;
		cin >> s;
		if(cnt[s]==0)cout << s << endl;
		else cout << s << "(" << cnt[s] << ")" << endl;
		cnt[s]++;
	}
}

posted:
last update: