您的位置:首页 > 其它

Codeforces Round #425 (Div. 2) B. Petya and Exam【模拟】

2017-08-09 23:05 405 查看

B. Petya and Exam

题意:

给你一串字母,这些字母都是good字符,其余的小写字母都是bad字符

再给你一个模式串,包括小写字母,
'*'
'?'
三种。

其中
‘?’
只能由一个good字符代替,
‘*’
只能由若干个(包括0)bad字符代替。

接下来给你N个字符串,判断这些字符串能否匹配模式串。

思路:

1.如果模式串不包括
'*'


1)模式串和匹配串的长度一定要相等,不相等NO,相等则接着扫描一遍。

2)如果模式串的字符为
'?'
,那么判断一下匹配串对应字符是否为good字符;

3)如果模式串的字符不为
'?'
,那么判断是否和匹配穿对应字符相等。

2.如果模式串包括
'*'


1)匹配串长度(
len2
)要大于等于模式串长度减1(
len1 - 1
),即去掉了
'*'


2)记录模式串中
‘*'
的位置pos。将匹配串分成三部分:

3)第一部分[0, pos) :与1中的第2、第3步类似。

4)第二部分[idx]:走模式串(pos, len1)范围,匹配串的
idx
len2-1
开始,从后往前,每次
idx--
。匹配与1中的第2、第3步类似。

5)第三部分[pos, idx]:全部都是bad字母。

代码:

#include <bits/stdc++.h>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
typedef long long LL;
typedef pair<int,int>pii;
const int maxn = 1e5;
string str, p, s;
char tp[maxn + 10];
int good[200];
int pos;
string scf() {
scanf("%s", tp);
return tp;
}
bool solve1() {
int len1 = p.size();
int len2 = s.size();
if(len1 != len2) return false;
for(int i = 0; i < len1; ++ i) {
if(p[i] == '?') {
if(good[s[i]] == 0) return false;
} else {
if(p[i] != s[i]) return false;
}
}
return true;
}
bool solve2() {
int len1 = p.size();
int len2 = s.size();
if(len2 < len1 - 1) return false;
//front
for(int i = 0; i < pos; ++ i) {
if(p[i] == '?') {
if(good[s[i]] == 0) return false;
} else {
if(p[i] != s[i]) return false;
}
}
//back
int idx = len2 - 1;
for(int i = len1 - 1; i > pos; --idx, -- i) {
if(p[i] == '?') {
if(good[s[idx]] == 0) return false;
} else {
if(p[i] != s[idx]) return false;
}
}
//bad
for(int i = pos; i <= idx; ++ i) {
if(good[s[i]] != 0) return false;
}
return true;
}
int main() {
str = scf();
memset(good, 0, sizeof(good));
for(int i = 0; i < str.size(); ++ i) good[str[i]] = 1;
p = scf();
bool star = false;
for(int i = 0; i < p.size(); ++ i) {
if(p[i] == '*') pos = i, star = true;
}
int T;
scanf("%d", &T);
while(T--) {
s = scf();
bool ok;
if(star == false) ok = solve1();
else ok = solve2();
if(ok) puts("YES");
else puts("NO");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: