T143360 【AHAOI Round1 pj T2】清理收藏夹
题目背景
#### 来自dbxxx的温馨提示:本题细节较多,请仔细阅读题面中的细节,尤其是加重加粗的部分。
众所周知,dbxxx是一个懒到炸裂的人,他每次看到啥比较好的网站都会放在收藏夹,于是他的收藏夹越来越满,找东西也麻烦到炸裂,但众所周知,dbxxx是一个懒到炸裂的人(再次强调),所以dbxxx想写一个程序来整理收藏夹,但众所周知,dbxxx是一个懒到炸裂的人(再再次强调),所以他想让你帮他写一个程序来整理他的收藏夹。
题目描述
dbxxx的收藏夹里收藏了 $n$ 个网址,按照时间顺序从早到晚排列。
我们规定,以下的网址关系都叫**一类相似网址**:
```plain
http://XXXX.com
http://www.XXXX.com
XXXX.com
www.XXXX.com
https://XXXX.com
https://www.XXXX.com
```
我们需要删除类似的网址,使其只留下一个,**按照表所列的顺序优先级删除**。比如`http://XXXX.com`和`https://www.XXXX.com`,优先删除`http://XXXX.com`。
而`http://www.XXXX.com`,`http://XXXX.com`,`https://XXXX.com`中,要删除`http://XXXX.com`和`http://www.XXXX.com`,只留下`https://XXXX.com`。
出现了两个一模一样的网址(即无任何差别)的网址当然也算重复网址啦。我们管这种网址关系叫做**相同网址**。相同网址也需要删除冗余的,只留一个。
另外,网址内容的大小写同样不分,即
`www.luogu.com.cn`和`www.LUOGU.COM.cn`是一个网址。此时若删除,删除**大写字母多的那一个**。如果两个网址的大写字母数量相同,删除**时间较晚的那个**。我们规定这种网址的关系叫做**二类相似网址**。并且,**协议头(即https://)和3w(www)只会是小写,不会是大写。**
两个网址还可以在协议不同的情况下,大小写仍然不同。(如`https://GOOGLE.com`和`http://google.com`)。此时仍然按照**二类相似网址**的删除规则进行删除。(如`https://GOOGLE.com`和`http://google.com`,应优先删除`https://GOOGLE.com`)。
同时,dbxxx想删除 $m$ 个他现在已经不需要的网址,我们需要把这些网址删除。**删除的时候记得把一类类似网址和二类相似网址都删掉**。**请注意dbxxx要删除的网址可能并不在收藏夹中**,此时输出`Error! Can't find website:` + 一个半角空格 + 网址。输出的顺序和dbxxx中输入的需删网址的顺序一样。~~嗯,dbxxx收藏的实在是太多,于是记不住收藏夹都有啥是很正常的事情,可以理解~~
最后,**按照网址去掉协议头和3w的字符串后,将所有大写字母变成小写字母后的字典序排列**。如`luogu.com.cn`就是网址`https://www.LUOgu.com.cn`经过这一操作后的结果。
输入格式
无
输出格式
无
说明/提示
对于 $10\%$ 的数据,$m = 0$,$n \le 5$,不存在任何相同,一类相似,二类相似网址。
对于 $20\%$ 的数据,$m \le 5$,$n \le 10$,不存在任何相同,一类相似,二类相似网址,需删除的网址在原收藏夹中都存在。
对于 $30\%$ 的数据,$m \le 5$,$n \le 10$,不存在任何相同,一类相似,二类相似网址。
对于 $50\%$ 的数据,$m \le 20$,$n \le 100$,不存在任何一类相似网址,二类相似网址。
对于 $60\%$ 的数据,$m \le 20$,$n \le 100$,不存在任何一类相似网址。
对于 $80\%$ 的数据,$m \le 200$,$n \le 1000$。
对于 $100\%$ 的数据,$0 \le m \le n \le 10^6$,网址长度$1\le len \le 50$,网址字符串不含空格,不含全角字符。
---
提示:本题可能会用到字符串快读快写,这里提供快读快写的板子:
```cpp
std :: string read() {
char ch;
std :: string ret;
ch = getc(stdin);
while (ch == ' ' || ch == '\n')
ch = getc(stdin);
while (ch != ' ' && ch != '\n') {
ret.push_back(ch);
ch = getc(stdin);
}
return ret;
}
void write(std :: string str) {
for (int i = 0; i < str.length(); ++i)
putc(str[i], stdout);
return ;
}
```