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"); } }
相关文章推荐
- Codeforces Round #425 (Div. 2) B. Petya and Exam
- Codeforces Round #425 (Div. 2) B. Petya and Exam
- Codeforces Round #425 (Div. 2) D. Misha, Grisha and Underground
- Codeforces Round #383 (Div. 2) A.Arpa’s hard exam and Mehrdad’s naive cheat【循环节/快速幂】
- Codeforces Round #212 (Div. 2) B. Petya and Staircases
- Codeforces Round #390 (Div. 2)-B Ilya and tic-tac-toe game(模拟)
- Codeforces Round #379 (Div. 2) D. Anton and Chess 模拟
- Codeforces Round #330 (Div. 2) A. Vitaly and Night(模拟)
- Codeforces Beta Round #61 (Div. 2) E. Petya and Post
- Codeforces Round #158 (Div. 2)C. Balls and Boxes(模拟)
- Codeforces Round #212 (Div. 2) B. Petya and Staircases
- Codeforces Round #383 (Div. 2) A. Arpa’s hard exam and Mehrdad’s naive cheat(快速幂水题)
- Codeforces Round #381 (Div. 2) B. Alyona and flowers(贪心 模拟)
- Codeforces Round #281 (Div. 2) A. Vasya and Football 模拟
- Codeforces Round #425 (Div. 2) Problem D Misha, Grisha and Underground (Codeforces 832D) - 树链剖分 - 树状数组
- Codeforces Round #425 (Div. 2) D.Misha, Grisha and Underground
- Codeforces Round #430 (Div. 2):D. Vitya and Strange Lesson(模拟建树)
- Codeforces Round #425 (Div. 2) D.Misha, Grisha and Underground
- Codeforces Round #425 (Div. 2) A. Sasha and Sticks
- Codeforces Round #331 (Div. 2)-Wilbur and Array(贪心模拟)