九野的博客,转载请注明出处:http://blog.csdn.net/acmmmm/article/details/12290467
题意:
若有单词覆盖输出NO
否则输出YES
字典树裸题,判断新建单词时 路径中是否存在 单词结尾
#include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#include<algorithm>
#include<set>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <math.h>
#include <queue>
#define ll int
using namespace std;
inline ll Min(ll a,ll b){return a>b?b:a;}
inline ll Max(ll a,ll b){return a>b?a:b;}
#define Word_Len 1000000
#define Sigma_size 11
int ch[Word_Len][Sigma_size]; //Word_Len是字典树的节点数 若都是小写字母Sigma_size=26
int Have_word[Word_Len]; //这个节点下有几个单词
int val[Word_Len]; // 这个节点附带的信息,初始化为0表示这个节点不存在单词,所以节点带的信息必须!=0
int sz ; //当前节点数
//初始化字典树
void init(){
sz = 1;
memset(ch[0], 0, sizeof(ch[0]));
memset(val, 0, sizeof(val));
memset(Have_word, 0, sizeof(Have_word));
}//初始化
int idx(char c){ return c-'0';} //字符串编号
bool Creat(char *s){
bool Have_creat=false; //是否新建了
int u = 0, len = strlen(s);
for(int i = 0; i < len; i++){
int c = idx(s[i]);
if(!ch[u][c]){ //节点不存在
memset(ch[sz], 0, sizeof(ch[sz]));
ch[u][c] = sz++;
Have_creat = true;
}
if(Have_word[u]==1)return false;
u = ch[u][c];
}
if(Have_word[u]==1)return false;
Have_word[u]=1;
return Have_creat;
}
char S[15];
int n;
int main(){
int T;scanf("%d",&T);
while(T--){
init();
int n;
scanf("%d",&n);
bool su=true;
while(n--){
scanf("%s",S);
if(su)
su = Creat(S);
}
if(su)printf("YES\n");
else printf("NO\n");
}
return 0;
}
/*
99
2
1
12
2
12
1
2
1234
1234
3
1234568
1236548
64213444
3
1
4562
123546
99
1
5
2
2
2
2
3
2
3
6
66
ans:
n
n
n
y
n
*/
/*
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<algorithm>
using namespace std;
char s[100010][11];
struct node
{
int cnt;
struct node *next[11];
void init(){memset(next,0,sizeof(next));}
};
node a[1000000];
struct node *root;
int indexx=0;
struct node *build()
{
a[indexx].cnt=1;
a[indexx].init();
return &a[indexx++];
}
void save(char *s)
{
int len=strlen(s);
struct node *p;
p=root;
for(int i=0;i<len;i++)
{
if(p->next[s[i]-'0']!=NULL)p->next[s[i]-'0']->cnt++;
else p->next[s[i]-'0']=build();
p=p->next[s[i]-'0'];
}
}
int search(char *s)
{
int len=strlen(s);
struct node *p;
p=root;
for(int i=0;i<len;i++)
{
if(p->next[s[i]-'0']->cnt==1)return 1;
p=p->next[s[i]-'0'];
}
return 0;
}
char str[40000][11];
int main()
{
int i,j,k,m,n,T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
indexx=0;
root=build();
for(i=0;i<n;i++)
{
scanf("%s",str[i]);
save(str[i]);
}
int flag=1;
for(i=0;i<n;i++)if(search(str[i])==0)
{
flag=0;
break;
}
if(flag)puts("YES");
else puts("NO");
}
return 0;
}
*/