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 }

 

posted @ 2017-07-26 10:17  qrfkickit  阅读(197)  评论(0编辑  收藏  举报