HDU 1671 Phone List 字典树基础

xiaoxiao2021-02-28  128

题目:点击打开链接

题意:给一堆电话号码,是否某个电话号码是其中一个电话号码的前缀,如果有则不能打通 ,输出NO ,没有就全部能连通 ,输出YES。

套模板就可以了,注意要释放内存。

#include<iostream> #include<string> #include<cstring> #include<cstdio> using namespace std; struct Tire { int num; //存储以当前字符串为前缀的字符串的数量 Tire *next[10]; Tire() { num=0; memset(next,0,sizeof(next)); } }*root; char s[10005][20]; void insert(char *s) { Tire *p=root; for(int i=0;s[i];i++) { int index=s[i]-'0'; if(!p->next[index]) p->next[index]=new Tire; p=p->next[index]; p->num++; } } int find(char *s) { Tire *p=root; for(int i=0;s[i];i++) { int index=s[i]-'0'; p=p->next[index]; } if(p->num>1) return 1; //如果这个号码出现了两次或以上,则肯定是某个号码的前缀 else return 0; } void del(Tire *T) { for(int i=0;i<10;i++) { if(T->next[i]!=NULL) del(T->next[i]); } delete T; } int main() { // freopen("E:\\ACM\\test.txt","r",stdin); int T,n; cin>>T; while(T--) { root=new Tire; //记得先申请空间 cin>>n; for(int i=0;i<n;i++) { cin>>s[i]; insert(s[i]); } int flag=0; for(int i=0;i<n;i++) { flag=find(s[i]); if(flag==1) break; } if(flag) puts("NO"); else puts("YES"); del(root); //释放内存 } return 0; }

转载请注明原文地址: https://www.6miu.com/read-43931.html

最新回复(0)