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;
}
然后给出一个字符串,字符串里面有字母,有“?”,有至多一个“*”。?可用上面的代替,*可以由任意非上面的字符组成的字符串,可以是空字符串。
给出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;
}
相关文章推荐
- CodeFroces 835C. Star sky(构造题)
- CodeFroces 175B. Plane of Tanks: Pro (构造)
- CodeFroces 195C. Try and Catch(阅读理解+猜题意+构造)
- CodeFroces 817A Treasure Hunt(构造题)
- CodeFroces 175A. Robot Bicorn Attack(构造)
- CodeFroces 817B. Makes And The Product(构造)
- CodeFroces 814B An express train to reveries(构造题)
- CodeFroces 831A. Unimodal Array(构造题)
- CodeFroces 831B. Keyboard Layouts(构造题)
- codeforces 891B Gluttony (构造+思维)
- 如何构造一个C#语言的爬虫蜘蛛程序
- 安卓训练-开始-使用 Fragment 构造动态 UI-创建 Fragment
- Codeforces Round #447 (Div. 2) C. Marco and GCD Sequence 构造
- 基于创建型模式的“迷宫”构造
- Codeforces Round #278 (Div. 2)---B. Candy Boxes (暴力+构造)
- Codeforces Round #447 (Div. 2) C. Marco and GCD Sequence(构造)
- 使用xloadtree读取数据库动态构造树
- unity学习之构造方法
- C++编译器构造类的潜规则
- 关于默认构造的问题——vector的resize函数