POJ1229 域名匹配
给你两个域名,域名中包含一些通配符。
* :匹配一个或任意多个部分
?:匹配一个或三个部分
!:匹配三个以上部分。
求这两个域名是否能够表示同一个域名?
域名的长度不超过255.
分析:设给出的域名为A,B,以f[i][j]表示域名A的前i个部分和域名B的前j个部分是否可能相同。类似于求最长公共子串的转移方式。
f[i][j]=f[i-1][j-1]||f[i][j-1] 如果A[i]是*号。
f[i][j]=f[i-1][j-1]||f[i-1][j-2]||f[i-1][j-3] //如果A[i]是?号,但这么写是有问题的。如果B[j]也是通配符,就错了。
于是我们势必将A[i]和B[j]一起考虑。这里就会有最多16种情况,当然其中有些情况可以合并。
但是仍然有问题。比如A[i]是?号,B[j]是?号。
如果方程这样写:f[i][j]=f[i-1][j-1]||f[i-1][j-2]||f[i-1][j-3]||f[i-2][j-1]||f[i-3][j-1] ,则如果B[j-1]是!号,则有问题。
如果方程这样写:f[i][j]=f[i-1][j-1]||f[i][j-1]||f[i-1][j],则如果f[i][j-1]=1,但此时A[i]已经表示了三个部分了,没办法再表示B[j]了,又怎么办呢?
所以这种转移是很不好办的。
我们感觉到,如果通配符只能表示0个,1个或任意多个是比较好处理的。所以,我们将原有的通配符做一个转换。
*意义不变
?变成只能匹配一个部分
!变成只能匹配0个或1个部分。
则原来的?=?!!(新符号)
原来的!=??*
这样的话,就好处理多了。
先考虑*号,再考虑!号,再考虑?或非通配符。具体转移看代码。
#include<iostream>
#include<cstdio>
#include<sstream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,cas;
#define MAXN 800
char s[MAXN][MAXN],t[MAXN][MAXN];
char ss[MAXN],tt[MAXN];
bool f[MAXN][MAXN];
int cnt1=,cnt2=,pos=;
int convert(char *ss,char s[][MAXN])
{
int cnt=,pos=;
int slen=strlen(ss);
for(int i=;i<slen;i++)
{
if(ss[i]!='.')
{
if(ss[i]=='!')
{s[cnt++][]='?';
s[cnt++][]='?';
s[cnt][]='*';
}
else if(ss[i]=='?')
{
s[cnt++][]='?';
s[cnt++][]='!';
s[cnt][]='!';
}
else s[cnt][pos++]=ss[i];
}
else
cnt++,pos=;
}
return cnt;
}
int main()
{
scanf("%d\n",&cas);
while(cas--)
{
memset(f,,sizeof f);
memset(s,,sizeof s);
memset(t,,sizeof t);
gets(ss);
//cerr<<ss<<endl;
gets(tt);
//cerr<<tt<<endl;
cnt1=convert(ss,s);
cnt2=convert(tt,t);
f[][]=;
for(int i=;i<=cnt1;i++)
for(int j=;j<=cnt2;j++)
{
if(s[i][]=='*')
f[i][j]=f[i][j]||f[i][j-]||f[i-][j-];
if(t[j][]=='*')
f[i][j]=f[i][j]||f[i-][j]||f[i-][j-]; else if(s[i][]=='!')
f[i][j]=f[i][j]||f[i-][j]||f[i-][j-];
else if(t[j][]=='!')
f[i][j]=f[i][j]||f[i][j-]||f[i-][j-];
else if(s[i][]=='?'||t[j][]=='?')
{
f[i][j]=f[i][j]||f[i-][j-];
}
else if(strcmp(s[i],t[j])==)
f[i][j]=f[i-][j-];
}
if(f[cnt1][cnt2]==)
printf("NO\n");
else printf("YES\n");
}
}
POJ1229 域名匹配的更多相关文章
- Apache 配置两个域名匹配的文件夹和配置多个Web站点
Apache的虚拟主机是一种同意在同一台机器上,执行超过一个站点的解决方式,同一时候也就能够邦迪二级域名到指定的文件夹.虚拟主机有两种.一种叫基于IP的(IP-based),还有一种叫基于名字的(na ...
- 【Nginx入门系列】第四章 通过域名匹配虚拟主机,不修改端口
域名访问原理 我们在显示生活中,我们怎样通过一个域名来访问到我们所需要的网站呢? 例如www.baidu.com,我们在浏览器输入百度网址会先发送请求到DNS服务器,DNS会通过我们的域名解析百度对应 ...
- tomcat匹配请求流程(原创)
tomcat8.0.36 配置Connector属性allowTrace为true时,允许TRACE方法,默认禁止. tomcat8.0.36有一个BUG,该BUG在8.0.37里被修复,就是一个解析 ...
- tomcat对请求路径的匹配过程(原创)
1.匹配服务 如果有两个应用,一个应用只能通过80端口访问,另一个应用只能通过8080端口访问,这种情况下,可以分开两个服务,然后分别创建80端口和8080端口的连接器. 2.匹配主机 一个服务下配置 ...
- nginx多域名配置
方法一:多个.conf方法(优点是灵活,缺点就是站点比较多配置起来麻烦) 这里以配置2个站点(2个域名)为例,n 个站点可以相应增加调整,假设: IP地址: 192.168.1.100域名1 exam ...
- Nginx的虚拟服务器域名配置
虚拟服务器名(server name)是通过指令server_name来指定的.在< Nginx是如何处理Request的?>一节中,我们讲到nginx分两步来匹配过来的Request请求 ...
- DNS Wildcard(DNS泛域名)
在DNS中,泛域名(wildcard Resource Record)可以被认为是一种合成RR的机制,借助于它,DNS服务器可以响应本来不存在的域名的请求,它的设计初衷是用来把所有邮件都转发到一个邮件 ...
- 关于 Cookie-free Domains (为什么将静态图片,js,css存放到单独的域名?)
这篇文章对高性能web开发具有参考性:http://developer.yahoo.com/performance/rules.html 本文主要描述使用裸域名做网站主域名时,如何用子域名做 cook ...
- .Net Core 二级域名绑定到指定的控制器
在说二级域名绑定之前,先说一下.net core中的区域,关于区域这一块儿在很久之前的博客中,已经提过,详见<03-dotnet core创建区域[Areas]及后台搭建>,在这篇博客中, ...
随机推荐
- 20150207读书笔记<深入理解计算机系统2-1>
第二章 信息存储 (1) 多数计算机以一个字节作为最小可寻址的存储器单元. 机器级程序将存储器看成一个非常大的字节数组,称为虚拟存储器. 存储器的每个字节都由唯一的数字标识,称为它的地址. 所有可能 ...
- 编程之美----NIM游戏
: 博弈游戏·Nim游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,Alice与Bob.Alice与Bob总是在进行各种各样的比试,今天他 ...
- HTML5的 2D SVG和SVG DOM的学习笔记(2)---SVG动画
SVG支持动画.可以通过以下几种方法获得动画效果: 使用SVG动画元素.SVG可以描述随时间变化的图形对象,使用不同的动画元素可以定义运动路径,淡入淡出效果和对象的膨胀.收缩.旋转和变换颜色. 使用S ...
- CASE表达式的使用
我们在开发过程中,经常需要针对一列,基于条件逻辑来返回一个值,那么,这时候就需要使用到CASE表达式了. 例如,以下对Products表的查询就在SELECT语句中使用了CASE表达式,以生成用于描述 ...
- iOS开发网络篇—文件的上传
iOS开发网络篇—文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代 ...
- POJ 3020 Antenna Placement 匈牙利算法,最大流解法 难度:1
http://poj.org/problem?id=3020 #include <cstdio> #include <cstring> #include <vector& ...
- webix源码阅读
最近在用webix,需要一个类似九宫格的监控界面.自带的控件里没有,于是萌生出做一个Custom Component的需求.不过webix关于自定义控件的文档比较少,官方只有一篇<Creatin ...
- 关于GSM基站定位
一、基站定位两个参数 1、什么是LAC:Location Area Code(LAC)地区区域码,用来划分区域 2、什么是CellID:Cell Tower ID(Cid)CellID代表一个移动基站 ...
- window2008 r2 负载均衡
两台服务器win2008 r2 ,iis7.5 ip地址192.168.5.16, 192.168.5.18 虚拟ip 192.168.5.30 设置过程: 1.在两台服务器上安装负载均衡模块 ...
- C++ Daily《2》----vector容器的resize 与 reserve的区别
C++ STL 库中 vector 容器的 resize 和 reserve 区别是什么? 1. resize 改变 size 大小,而 reserve 改变 capacity, 不改变size. 2 ...