您的位置:首页 > 其它

CodeFroces 823B. Petya and Exam(构造题)

2017-07-25 09:50 357 查看
题目大意:先给出一个合法的字符串,里面的字符可以代替接下来的“?”。

然后给出一个字符串,字符串里面有字母,有“?”,有至多一个“*”。?可用上面的代替,*可以由任意非上面的字符组成的字符串,可以是空字符串。

给出n组查询,问是否合法。查询的总长度不超过1e5.

解法:由于查询的总长度不超过1e5,所以直接一个一个对比即可。

我们先对合法的字符进行预处理,做好标记。在接下来的?中,直接判断这个字符是否合法即可。

*是个麻烦,但是很重要的一个条件,说*最多只能出现一次。那么其他字符都是一一匹配的。所以说我们在*中肯定是匹配len2 - len1中相差的字符。我们只需要检验这一段的字符是否合法即可。

代码如下:

#include<bits/stdc++.h>
using namespace std;
bool ok[35];
char str[100005];
char str2[100005];
int len1, len2, n;

int main() {
scanf("%s", str);
for(int i = 0; str[i]; i++)
ok[str[i] - 'a'] = 1;
scanf("%s", str);
len1 = strlen(str);
cin >> n;
while(n--) {
scanf("%s", str2);
len2 = strlen(str2);
int k = 0;
bool flag = 1;
int i;
for(i = 0; i < len1 && k < len2 && flag; i++, k++) {
if(str[i] >= 'a' && str[i] <= 'z') {
if(str[i] != str2[k]) {
flag = 0;
}
} else if(str[i] == '?') {
if(!ok[str2[k] - 'a']) {
flag = 0;
}
} else {
while(len2 - k >= len1 - i && k < len2 && !ok[str2[k] - 'a'])
k++;
k--;
}
}
if(str[i] == '*')
i++;
if(i != len1 || k != len2)
flag = 0;
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: