HDU2585

Problem: 호텔 설명: 호텔에 혼자 묵습니다.그러나 그는 문패 번호를 잊어버렸다. 지금은 그가 모호하게 기억하고 있는 문패 번호 문자열을 제시했다. 이 문자열은'*','?','a-z’.‘* ’0자 이상의 문자를 나타냅니다.임의의 자모를 표시하다.지금 여러 개의 후보를 내서 이 사람의 문패 번호에 맞는 몇 개를 찾아내라고 하세요.Solution: 귀속.우리는'*'라는 문자를 잡았다.이 문자는 우리로 하여금 원래 문제보다 더 작은 해답을 얻을 수 있게 한다.예를 들어 우리는'*hh'와'flushhip'을 비교하고'*'를 만나면 별표 뒤의'hh'와'flushhip','lushhip','ushhip','shhip','hhip'등을 비교한다.귀속이 끝나는 조건은 패턴이 끝까지 이어지는 것이다.Code(C++):
#include <stdio.h>
#include <string.h>

const int M=55;

char tag[M];
char str[M];

int flag_len;

bool work(int start_tag,int start_str,int len)
{
    if(start_tag==flag_len&&start_str==len)
        return true;
    switch(tag[start_tag]){
    case '*':
        if(start_tag+1==flag_len)
            return true;
        for(int i=start_str;i<len;i++)
            if(work(start_tag+1,i,len))
                return true;
        return false;

    case '?':
        return work(start_tag+1,start_str+1,len);

    default:
        return tag[start_tag]==str[start_str]? work(start_tag+1,start_str+1,len):false;
    }
}

int main()
{
    while(~scanf("%s",tag)){

        flag_len=strlen(tag);

        int n;
        int ans=0;
        for(scanf("%d",&n);n--;){
            scanf("%s",str);
            ans+=work(0,0,strlen(str))? 1:0;
        }
        printf("%d
"
,ans); } return 0; }

좋은 웹페이지 즐겨찾기