Summer Training Team Selection (1) Problem D Hidden Password STL,字符串匹配,简单题

Problem D
Hidden Password
Time limit: 1 second
Insecure Inc. has decided to shift directions after a failed attempt at developing a new encryption standard.
Their new effort is a password system used to hide a password inside another string of characters we denote
as a message. However, it is important that the message has a certain property relative to the hidden
password.
Let us assume that we denote the characters of the password as c1c2 : : : cP (although those characters need
not be distinct). To be a valid message for the password, if you start from the beginning of the message and
search for any character from the set fc1; : : : ; cP g, it must be that c1 is the first that you find. Subsequently,
if you continue looking from that point of the message for any character from the set fc2; : : : ; cP g, it must
be that c2 is the next that you find. Continuing in that manner, c3 must be the next character from the set
fc3; : : : ; cP g, and so on until reaching cP .
For example, if the password is ABC, then the string HAPPYBIRTHDAYCACEY is a valid message.
 Notice that A is the first of the set fA, B, Cg to appear in the message. (The initial H is not relevant.)
 Following the A that was found, the next occurrence from the set fB, Cg is B.
 Following the B that was found, the next occurrence from the set fCg is indeed C.
(Note that the A in DAY is not relevant, since we are only looking for a C at this point, and the
additional A and C in CACEY are not relevant, because we have already completed the password with
the first C.)

However, for the password ABC, the string TRAGICBIRTHDAYCACEY is not a valid message.

 While the A is the first of the set fA, B, Cg to appear in the string,
the next occurrence from the set fB, Cg is C rather than B.
Also, the string HAPPYBIRTHDAY is not a valid message for the password ABC because the C never appears.
As an example with duplicate letters in the password, consider the password SECRET. For this password,
the string SOMECHORESARETOUGH is a valid message. In contrast, the string SOMECHEERSARETOUGH
is not a valid message, because an extraneous E is found at the point when an R is first expected.
Input
The input consists of a single line containing two strings. The first string is the password, having length P,
with 3  P  8. The second string has length S, with 10  S  40. Both strings will consist solely of
uppercase letters. (That is, neither string can include whitespace, lowercase letters, digits, or other special
characters.)
Output
Output a single line with the word PASS if the second string is a valid message for the password, or FAIL
otherwise.

题目详情见Source的链接里

Source

2016 UESTC ACM Summer Training Team Selection (1)

ACM-ICPC 2015 Mid-Central Regional Problem D: Hidden Password

My Solution

先用map记录下来password中每个字母出现的次数;

然后去历遍message,如果当前访问的不是正在查找的,并且在map中的记录里不是0,那么FAIL

                                   如果是则,map里想要的字母--,然后查找password中的下一个字母

复杂度 O(n)

#include <iostream>
#include <cstdio>
#include <string>
#include <map>
using namespace std;
map<char, int> pw;

int main()
{
    #ifdef LOCAL
    freopen("a.txt", "r", stdin);
    #endif // LOCAL
    string password, line;
    cin>>password;
    cin>>line;
    int sz1 = password.size();
    int sz2 = line.size();
    int ptr = 0, fall = 1;
    for(int i = 0; i < sz1; i++){
        pw[password[i]]++;
    }
    for(int i = 0; i < sz2; i++){
        if(line[i] == password[ptr]){
            pw[password[ptr]]--;
            ptr++;
            if(ptr == sz1){
                fall = 0;
                break;
            }
        }
        else{
            if( pw[line[i]] != 0){
                fall = 1;
                break;
            }
        }
    }
    if(fall) printf("FAIL");
    else printf("PASS");
    return 0;
}

Thank you!


                                                                                                                                               ------from ProLights


你可能感兴趣的:(字符串,ACM,简单匹配)