[NOI1997]文件匹配

成绩 0 开启时间 2013年01月22日 星期二 13:40
折扣 0.8 折扣时间 2013年01月22日 星期二 13:40
允许迟交 关闭时间 2013年01月22日 星期二 13:40
输入文件 wildcard.in 输出文件 wildcard.out

在计算机的日常操作中,经常需要对当前回录下的所有文件中的一部分文件进行操作。例如,将当前目录下的所有文本文件复制至另一个目录下:将当前目录下所有以a 打头的文件删除; 等等。

很多操作系统都采用正则表达式来实现文件匹配功能。一种简单的正则表达式由英文字母(区分大小写)。数字及通配符”*”和”?”组成,”?”代表任意一个字符,”*””则可以代表零个或任意多个字符。

例如:

  • a*b可以匹配acb(*代表c)
    • 可以匹配aabb (*代表ab)
    • 可以匹配asdsfdfdb (*代表sdsfdfd)
    • 可以匹配ab (*不代表任何字符)
  • a*b不可以匹配ac(缺少最右边的字母b)
    • 不可以匹配bb(缺少最左边的字母a )
    • 不可以匹配 abbc(最右边的字母不是b)
  • a?b可以匹配acb(?代表c)
    • 不可以匹配ab(缺少中间的一个字符)
    • 不可以匹配accb(?只能代表一个字符)

现要对某目录下的部分文件进行操作。写一个程序,寻找一个正则表达式,使其能匹配的待操作文件最多,但不能匹配任何不进行操作的文件。注意你所找到的最优正则表达式的长度应当是最短的。如果有多个长度最短的最优正则表达式,则其中任意一个都是允许的。

输入输出

输入文件由N(1<=N<=250)行组成。每行给出了一个文件名(由英文字母和数字组成:英文字 符要区分大小写,文件名长度不超过8个字符),其后是一个空格符和一个字符(“+”或"-").“+”表示要对该行给出的文件进行操作,"-”表示不进行 操作。

输出文件由两行组成。第一行是一个整数,给出了你的程序所找到的最优正则表达式所能匹配的文件数目.在第二行给出你的程序所找到的最优正则表达式。

样例

输入文件

EXCHANGE +
EXT +
HARDWARE +
MOUSE -
NETWORK -

输出文件

2
E*