zoukankan      html  css  js  c++  java
  • 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
    ";
     75             else printf("YES
    ");
     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
    ";
     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
    ";
    117                 else cout << "YES
    ";
    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
    ";
    163                 else cout << "YES
    ";
    164             }
    165         }
    166 
    167     }
    168 
    169     return 0;
    170 }
  • 相关阅读:
    php面试题目
    JavaScript表单处理的返回值问题
    超链接在javascript:void(0)时没有事件响应
    php 两个美元符号:可变变量
    [Ubuntu] lampp安装Zend Framework
    [Ubuntu] 安装字体
    php中bindValue 和 bindParam 的区别
    php遍历文件夹(获得文件名)
    php输出一段字符块
    PHP 全角和半角转换函数
  • 原文地址:https://www.cnblogs.com/kickit/p/7238136.html
Copyright © 2011-2022 走看看