SP29 HASHIT - Hash it!
题目描述
你的任务是计算一个包含 $101$ 个元素的哈希表,其中包括若干个长度不超过 $15$ 个大小写字母(ASCII 码从 `A` 到 `z`)的 key 字符串。其中可能包含以下操作:
* 查找该 key 值指向的元素(如果该元素不存在,那么忽略掉这次操作),
* 在这个表中插入一个 key 字符串(如果该 key 已存在,那么忽略掉这次操作),
* 在不移动其他 key 的前提下,通过将 key 指向的元素标记为空来删除一个字符串(如果该 key 不存在,那么忽略掉这次操作)
查找、插入、删除操作定义如下:
对于一个长度为 $n$ 的字符串 $key=a_1a_2\ldots a_n$,其哈希值为 $Hash(key)$。
$$Hash(key)=h(key) \bmod 101$$
$$h(key)=19\times \sum_{i=1}^n i\times \operatorname{ASCII}(a_i)$$
对于哈希冲突,我们采用开放地址的方法解决。例如,当我们尝试将 key 插入到哈希表第一个空位置时,对于 $j$ = $1,\ldots,19$,我们令存放地址为 $(Hash(key) + j^2 + 23j)\bmod101$,如果检查 $20$ 个位置后仍出现地址被占用,我们就认为这次插入操作无法进行。
输入格式
第一行输入测试数据组数 $t$($1 \le t \le 100$)。
对于每组测试数据:
- 第一行包含操作数 $n$($1 \le n \le 1000$)。
- 以后每一行输入一次操作。操作可能为插入 `ADD:string` 或删除 `DEL:string`。
对于所有测试数据,行与行之间不存在空行。
输出格式
对于每一组测试,你都应该建立一个新的哈希表来插入或删除 key,并在操作完成后输出:
第一行包含一个数字 $m$,代表该哈希表中的 key 数量。
接下来 $m$ 行,每行输出一组 `下标:key`,按下标顺序输出这个哈希表。