字典树 于是他错误的点名开始了

字典树首先把n个名字都insert进去,用f来标记,此时统一标记为1

再检测化学老师报的m个名字

如果当前节点没有建造,说明是错误的名字,输出wrong

如果f是-1就是repeat

如果正常输出一次后就把标记f改成-1

#include<stdio.h>
#include<string.h>
#include<bits/stdc++.h>
using namespace std;
const int maxn=4e5+6;
int trie[maxn][53],f[maxn];
int n,m,tot;
void insert(char s[])
{
    int l=strlen(s),now=0;
    for(int i=0;i<l;i++)
    {
        int c=s[i]-'a';
        if(!trie[now][c])
            trie[now][c]=++tot;
        now=trie[now][c];
    }
    f[now]=1;
}
void test(char s[])
{
    int l=strlen(s),now=0;

    for(int i=0;i<l;i++)
    {
        int c=s[i]-'a';
        if(!trie[now][c])
        {
         printf("WRONG\n");
         return ;
        }
        now=trie[now][c];
    }
    if(f[now]==-1)
                 printf("REPEAT\n");
    else
    {
        printf("OK\n");
        f[now]=-1;
    }
}
int main()
{
  scanf("%d",&n);
  char a[53];
  for(int i=1;i<=n;i++)
   { scanf(" %s",a);
    insert(a);
   }
   scanf("%d",&m);
  for(int i=1;i<=m;i++)
  {
      scanf(" %s",a);
      test(a);
  }
}

 

posted @ 2021-08-04 15:30  废柴废柴少女  阅读(32)  评论(0)    收藏  举报