字典树 于是他错误的点名开始了
字典树首先把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); } }
浙公网安备 33010602011771号