百练+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; }
相关文章推荐
- 【Unity】11.3 基本碰撞体(箱体、球形、胶囊、网格)
- linux 硬盘分区,分区,删除分区,格式化,挂载,卸载笔记
- 个人工作总结10
- 通过颜色生成图片
- leetcode——142——Linked List Cycle II
- 百练+BFS+图上visit标记嘛,因为是最短嘛,防止重复嘛
- 项目1-点-圆-圆柱类族的设计(3)
- Chrome和Firefox常用插件
- java中的IO整理
- 【DP】探索数字迷塔
- 什么是ajas
- HTTP系列(二):连接管理
- 安装并运行Elasticsearch
- Redis+Spring缓存实例(windows环境,附实例源码及详解)
- 六、树和二叉树--(0)什么是树
- ABP中动态WebAPI原理解析
- 【Unity】11.2 刚体(Rigidbody)
- 顺序表的基本操作
- leetcode 283---Move Zeroes&&对vector erase()和remove用法的感悟
- Error running app: Instant Run requires 'Tools | Android | Enable ADB integration' to be enable