比赛 “Asm.Def战记之太平洋”杯 评测结果 AAWWWWWAWW
题目名称 Asm.Def谈笑风生 最终得分 30
用户昵称 devil 运行时间 0.420 s
代码语言 C++ 内存使用 0.31 MiB
提交时间 2015-11-02 10:40:05
显示代码纯文本
#include <cstdlib>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <stack>
#include <vector>
#include <map>
#include <queue>
#include <ctime>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef unsigned int uint;
const int inf=1061109567;
const int maxn=100010;
const int maxm=27;
const int mod=1000000007;
const double pi=3.14;

struct node
{
    node *next[maxm];
    int flag;
};

node *root;

node *newnode()
{
    node *tmp=new node;
    for(int i=0;i<maxm;i++) tmp->next[i]=NULL;
    return tmp;
}

void build(char *str)
{
    int len=strlen(str);
    node *p=root;
    int alp;
    for(int i=0;i<len;i++)
    {
        alp=str[i]-'a';
        if(p->next[alp]==NULL)
            p->next[alp]=newnode();
        p=p->next[alp];
    }
    p->flag=1;
}

bool found(char *str)
{
    int len=strlen(str);
    node *p=root;
    int alp;
    for(int i=0;i<len;i++)
    {
        if(str[i]=='*')
        {
            for(int k=0;k<26;k++)
            {
                if(p->next[k]==NULL) continue;
                p=p->next[k];int j;
                for(j=i+1;j<len;j++)
                {
                    alp=str[j]-'a';
                    if(p->next[alp]==NULL) break;
                    p=p->next[alp];
                }
                if(j==len&&p->flag==1) return true;
            }
            return false;
        }
        alp=str[i]-'a';
        if(p->next[alp]==NULL) return false;
        p=p->next[alp];
    }
    if(p->flag==1) return true;
    return false;
}

int main()
{
    freopen("asm_talk.in","r",stdin);
    freopen("asm_talk.out","w",stdout);
    //clock_t st=clock();
    int m,kase;scanf("%d",&m);
    char s[maxm];root=newnode();
    memset(s,0,sizeof(s));
    while(m--)
    {
        scanf("%d %s\n",&kase,s);
        if(kase==1)
        {
            build(s);
            memset(s,0,sizeof(s));
        }
        else
        {
            if(found(s)) printf("YES\n");
            else printf("NO\n");
        }
    }
    //clock_t ed=clock();
    //printf("\nTime used : %.5lf Ms\n",double(ed-st)/CLOCKS_PER_SEC);
    return 0;
}