use defaultdict