题目描述
给出n个字符串,求是否存在一个串是另一个串的前缀。
思路
字典树的模板题。我们考虑在建字典树时增加end标记,在插入字符串判断是否访问到end标记即可。不过需要特判是否插入过重复串,因为一个串的前缀也包括它自己。
代码
#include <bits/stdc++.h> using namespace std; const int MAXN=1e5+10; int ch[MAXN][11],ed[MAXN],tot; void clear() { memset(ch,0,sizeof(ch)); memset(ed,0,sizeof(ed)); } bool insert(char *s) { int len=strlen(s); int x=1; bool f=0; for(int i=0;i<len;i++) { int num=s[i]-'0'; if(!ch[x][num])ch[x][num]=++tot; else if(i==len-1)f=1; x=ch[x][num]; if(ed[x])f=1; } ed[x]=1; return f; } int main() { int t; scanf("%d",&t); while(t--) { int n; char s[20]; tot=1; clear(); scanf("%d",&n); bool ans=0; for(int i=1;i<=n;i++) { scanf(" %s",s); if(insert(s))ans=1; } if(!ans)printf("YES\n"); else printf("NO\n"); } return 0; }