oj1500(Message Flood)字典树
大意:輸入幾個(gè)字符串,然后再輸入幾個(gè)字符串,看第一次輸入的字符串有多少?zèng)]有在后面的字符串中出現(xiàn)(后輸入的字符串不一定出現(xiàn)在之前的字符串中)
?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Node
{ ???
int flag;
?????struct Node *next[26];
}Node,*Tree;
char a[20010][20];
int n,m;
void Creat(Tree &T)
{ ??
???? ?int i; ?
?????T=(Tree)malloc(sizeof(Node));
??? ?T->flag=0;
?? ??for(i=0;i<26;i++) ??
????? T->next[i]=NULL;
}
void insert(Tree &T,char *s)
{ ??
int l,i,t; ??
Tree p=T; ??
l=strlen(s); ??
for(i=0;i<l;i++) ??
{ ????
if(s[i]>='a'&&s[i]<='z') ??
t=s[i]-'a'; ?
else t=s[i]-'A';
? if(p->next[t]==NULL) ??
Creat(p->next[t]); ???
? p=p->next[t]; ??
?? } ?
? p->flag=1;
}
int search(Tree T,char *s)
{ ???
Tree p=T;
? ? int i,k,t;
?? ? k=strlen(s);
??? ?for(i=0;i<k;i++)?
??? {? ????
?????? ?if(s[i]>='A'&&s[i]<='Z')? ??
????????? t=s[i]-'A';? ??????
?????? else? ??????????
? t=s[i]-'a';?
?? if(p->next[t]==NULL) ?
? ?return 0; ??
p=p->next[t];
?}
?if(p->flag)
?{ ???
return 1;
?}
?else return 0;
}
void Delete(Node *p)?
{? ??
? int i;?
??? for(i=0; i<26; i++)?
??? {? ??????
? if(p->next[i]!=NULL)? ????
??????? Delete(p->next[i]);?
??? }? ??
? free(p);?
? }?
? int main()
{ ???
? int i,j,sum;
? char str[20];
?Tree T; ?
while(scanf("%d",&n)!=EOF&&n!=0)
?{ ??????
Creat(T); ???
? sum=0; ??
?? ?scanf("%d",&m);
??? for(i=0;i<n;i++) ?
??? scanf("%s",a[i]); ?
?? for(i=1;i<=m;i++) ?
?? { ???
??? ?scanf("%s",str); ?
??? ?insert(T,str); ???
? } ???
for(i=0;i<n;i++)
???{ ?????
? j=search(T,a[i]); ??
???? if(j) ??
?? sum++; ???
} ???
printf("%d\n",n-sum);? ??
???? Delete(T);?
?}
?return 0;
} ?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/zhangmingcheng/p/3804960.html
總結(jié)
以上是生活随笔為你收集整理的oj1500(Message Flood)字典树的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java IO - 字符流
- 下一篇: 研究:低智商男人易出轨