您的位置:首页 > 其它

百练+Trie数+求字符串前缀的经典模板

2016-05-02 21:59 274 查看
点击打开链接
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
#include<cstring>
#include<string>
#include<math.h>
#include<algorithm>
#define LL long long
#define inf 0x3f3f3f3f
#define mod 1e9+7
using namespace std;
struct Node{
struct Node *next[10];///只有0-9这10个
int isCover, isEnd;
};
int ok;
void clean(Node *p)
{
memset(p->next,0,sizeof(p->next));
p->isCover = p->isEnd = 0;
}
void Insert(char *str, Node *root)
{
Node *p = root;
int id;
while(*str){
id = *str - '0';
if(p->next[id] == NULL){
p->next[id] = (Node *)malloc(sizeof(Node));
clean(p->next[id]);
}
p = p->next[id];
if(p->isEnd) ok = 0;///有前缀了,这里标记一波。
++p->isCover;
++str;///字符串移动一波。
}
if(p->isCover > 1) ok = 0;
p->isEnd = 1;///字符串最后一个字符的附加信息标记。
}
void DELETE(Node *p)
{
for(int i = 0; i < 10; ++i)///典型递归模板,10个表示0-9
if(p->next[i]) DELETE(p->next[i]);
free(p);
}
int main()
{
int t, n;
char str[12];
scanf("%d", &t);
while(t--){
Node *root = (Node *)malloc(sizeof(Node));
scanf("%d", &n);
clean(root); ok = 1;
while(n--){
scanf("%s", str);
if(ok) Insert(str, root);
}
printf(ok ? "YES\n" : "NO\n");///YES表示没有前缀,NO表示有前缀。
DELETE(root);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: