2 3 911 97625999 91125426 5 113 12340 123440 12345 98346
NO YES这题用了两种方法,一种是把他们排序,再相邻两个进行比较,如果发现有包涵关系立马退出,例外一种是用字典树进行匹配#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; typedef struct Trie{ int v; Trie *next[10]; }Trie; Trie *root; bool flag; void inti()//初始化 { root = (Trie *)malloc(sizeof(Trie)); root->v=0; for(int i=0;i<10;i++) root->next[i]=NULL; } void Create(char *str)//插入 { int len=strlen(str); Trie *p = root,*q; for(int i=0;i<len;i++) { int id=str[i]-'0'; if(p->next[id]==NULL) { q = (Trie *)malloc(sizeof(Trie)); q -> v = 0; for(int i=0;i<10;i++) { q->next[i]=NULL; } p->next[id]=q; } else { if(p->next[id]->v==1||str[i+1]=='\0')//表示字典树中包涵这个串的子串 { flag=true; return ; } } p=p->next[id]; } p->v=1; } void Shifang(Trie *p)//释放内存 { if(p==NULL)return ; for(int i=0;i<10;i++) { if(p->next[i]!=NULL) Shifang(p->next[i]); } free(p); return ; } int main() { char str[100]; int t,n; scanf("%d",&t); while(t--) { inti(); flag=false; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%s",&str); if(!flag)Create(str); } if(!flag)printf("YES\n"); else printf("NO\n"); Shifang(root);//必须加这个,不然会爆的 } return 0; }#include <iostream> #include <cstring> #include <cstdio> #include <string> #include <algorithm> using namespace std; string s[10004]; int n; int fun() { int i,j; for(i=1;i<n;i++) { int len=s[i-1].length(); for(j=0;j<len;j++) { if(s[i][j]!=s[i-1][j])break; } if(j>=len)return false; } return true; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=0;i<n;i++) cin>>s[i]; sort(s,s+n); if(fun()) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
Phone List(字典树),布布扣,bubuko.com
原文:http://blog.csdn.net/zhangweiacm/article/details/38471033