codeforces round 425 div2
A. Sasha and Sticks
水题,判断一下次数的奇和偶就可以的。
B. Petya and Exam
赛上的时候没有写出来,orz,记录一下吧。
题意:给出一个模式串,可能会有?和*两种符号,*最多有一个。?可以被好的字符代替,*可以被空串,坏的字符,坏的字符串代替,现在给出n个字符串,问这些字符串是否满足要求。好的字符在开头已经给出。
思路:
对于不包含*的串,直接判断?位置的是否都为好字符就ok了。
对于包含*的串,做如下处理,首先把*代表的bad串提取出来,再把模式串中的*擦除,然后将bad串插入模式串中,将现在的模式串与输入的串进行比较。提取bad串所用的方法,不是判断坏字符,因为原字符串可能全是坏字符,而是利用原字符串与现在的字符串的长度的差来从*位置开始提取。这其中用到了string的很多黑科技。
代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <string> 4 #include <vector> 5 #include <iostream> 6 using namespace std; 7 8 bool a[30]; 9 10 int pos[100005]; 11 12 int main() 13 { 14 string s; 15 16 cin >> s; 17 18 for (int i = 0;i < s.size();i++) 19 { 20 a[s[i]-'a'] = 1; 21 } 22 23 string pa; 24 25 cin >> pa; 26 27 int cnt = 0; 28 29 int mark = -1; 30 31 for (int i = 0;i < pa.size();i++) 32 { 33 if (pa[i] == '?') 34 { 35 pos[cnt++] = i; 36 } 37 38 if (pa[i] == '*') 39 { 40 mark = i; 41 } 42 } 43 44 int n; 45 46 scanf("%d",&n); 47 48 49 50 if (mark == -1) 51 { 52 for (int i = 0;i < n;i++) 53 { 54 bool f = 0; 55 56 string t; 57 58 string tpa = pa; 59 60 cin >> t; 61 62 for (int j = 0;j < cnt;j++) 63 { 64 if (f) break; 65 66 int id = t[pos[j]] - 'a'; 67 68 if (!a[id]) f = 1; 69 else tpa[pos[j]] = t[pos[j]]; 70 } 71 72 if (tpa != t) f = 1; 73 74 if (f) cout << "NO\n"; 75 else printf("YES\n"); 76 } 77 } 78 else 79 { 80 for (int i = 0;i < n;i++) 81 { 82 string t; 83 84 cin >> t; 85 86 string tmp = pa; 87 88 tmp.erase(mark,1); 89 90 int des = t.size() - tmp.size(); 91 92 if (des < 0) cout << "NO\n"; 93 else if (des == 0) 94 { 95 bool f = 0; 96 97 for (int j = 0;j < t.size();j++) 98 { 99 if (tmp[j] == '?') 100 { 101 char c = t[j]; 102 103 if (!a[c-'a']) 104 { 105 f = 1; 106 break; 107 } 108 } 109 else if (tmp[j] != t[j]) 110 { 111 f = 1; 112 break; 113 } 114 } 115 116 if (f) cout << "NO\n"; 117 else cout << "YES\n"; 118 } 119 else 120 { 121 string bad; 122 123 bool f = 0; 124 125 for (int j = 0;j < des;j++) 126 { 127 char c = t[mark+j]; 128 129 if (a[c-'a']) 130 { 131 f = 1; 132 break; 133 } 134 else bad.push_back(c); 135 } 136 137 138 if (!f) 139 tmp.insert(mark,bad); 140 141 //cout << bad << " " << tmp << endl;; 142 143 for (int j = 0;j < t.size();j++) 144 { 145 if (tmp[j] == '?') 146 { 147 char c = t[j]; 148 149 if (!a[c-'a']) 150 { 151 f = 1; 152 break; 153 } 154 } 155 else if (tmp[j] != t[j]) 156 { 157 f = 1; 158 break; 159 } 160 } 161 162 if (f) cout << "NO\n"; 163 else cout << "YES\n"; 164 } 165 } 166 167 } 168 169 return 0; 170 }
康复训练中~欢迎交流!