小慕正在开发一个软件版本管理系统,每个软件版本都用一个三段式版本号来表示,格式为`a.b.c`。 其中: * `a`表示主版本号; * `b`表示次版本号; * `c`表示修订号; * `b`和`c`可以省略,因此版本号也可以写成`a.b`或`a`; * 每一段都是范围在`[0,999]`之间的整数; * 版本号中不会出现前导零。 为了判断两个不同的依赖库是否能被同一个软件版本兼容,小慕使用「版本范围」来描述允许的版本。 一个版本范围由一个和一个版本号组成。 前缀可能为`=`,`>`,`>=`,``,`>=`,`v`表示版本必须大于`v`; * `>=v`表示版本必须大于等于`v`; * `=3.5`等价于`>=3.5.0`。 对于前缀`~`,规则如下: 如果给出了次版本号`b`,则表示从当前版本开始,到下一个次版本号之前结束。 也就是说: * `~a.b`表示范围`[a.b.0,a.(b+1).0)`; * `~a.b.c`表示范围`[a.b.c,a.(b+1).0)`。 例如: * `~1.9`表示`[1.9.0,1.10.0)`,也就是`[1.9.0,1.9.999]`; * `~1.9.5`表示`[1.9.5,1.10.0)`,也就是`[1.9.5,1.9.999]`; * `~1.0.0`表示`[1.0.0,1.1.0)`,也就是`[1.0.0,1.0.999]`。 如果没有给出次版本号`b`,即版本号只有主版本号`a`,则表示从当前主版本号开始,到下一个主版本号之前结束。 也就是说: * `~a`表示范围`[a.0.0,(a+1).0.0)`。 例如: * `~1`表示`[1.0.0,2.0.0)`,也就是`[1.0.0,1.999.999]`。 注意:`~1`和`~1.0`、`~1.0.0`表示的范围不同。 现在小慕手中有若干对版本范围。对于每一对范围,判断是否存在至少一个版本号,能够同时满足这两个范围。 如果存在,输出`yes`;否则输出`no`。
提示:带虚线的词点一下有通俗解释。
输入描述
第一行包含一个整数`q`,表示需要判断的结界范围对数。 接下来`q`行,每行包含两个字符串`spellA`和`spellB`,表示两个版本结界范围,中间用一个空格分隔。 * `1999.999.999`或`<0.0.0` * 版本号每一段均无前导零
输出描述
输出`q`行。 对于每一对范围,如果存在交集,输出`yes`;否则输出`no`。
示例
示例 1
输入
5 >=2.4 <2.4.0 ~3.7 =3.7.999 ~3.7.999 =3.8.0 >0.999.999 =1 <=5.0 >5
输出
no yes no yes no
说明:第一组: * `>=2.4`等价于范围`[2.4.0,999.999.999]`; * `<2.4.0`等价于范围`[0.0.0,2.3.999]`; * 两个范围没有交集。 第二组: * `~3.7`表示范围`[3.7.0,3.8.0)`,也就是`[3.7.0,3.7.999]`; * `=3.7.999`表示范围`[3.7.999,3.7.999]`; * 两个范围存在交集。 第三组: * `~3.7.999`表示范围`[3.7.999,3.8.0)`,也就是`[3.7.999,3.7.999]`; * `=3.8.0`不在该范围内; * 两个范围没有交集。 第四组: * `>0.999.999`等价于范围`[1.0.0,999.999.999]`; * `=1`等价于范围`[1.0.0,1.0.0]`; * 两个范围存在交集。 第五组: * `<=5.0`等价于范围`[0.0.0,5.0.0]`; * `>5`等价于范围`[5.0.1,999.999.999]`; * 两个范围没有交集。
示例 2
输入
4 ~8 =8.999.999 ~8.0 =8.999.999 <4.2 >=4.1.999 =0 ~0
输出
yes no yes yes
时间限制 1000 ms · 内存限制 128 MB