zoj 2876 Phone List

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define ZERO 0
const int  FIRST_CHAR = '0';
char  num[11111][20] ;
typedef struct node
{
    struct node *child[20]; /* 存储下一个字符 */
    int n; /* 记录当前单词出现的次数 */
}node, *Node;

Node root; /* 字典树的根结点(不存储不论什么字符) */
/* 插入单词 */
void insert(char *str)
{
    int i, index, len;
    Node current = NULL, newnode = NULL;

    len = strlen(str);

    current = root; /* 開始时当前的结点为根结点 */
    for (i = 0; i < len; i++) /* 逐个字符插入 */
    {
        index = str[i] - FIRST_CHAR; /* 获取此字符的下标 */
        if (current->child[index] != NULL) /* 字符已在字典树中 */
        {
            current = current->child[index]; /* 改动当前的结点位置 */
            (current->n)++; /* 当前单词又出现一次, 累加 */
        }
        else /* 此字符还没出现过, 则新增结点 */
        {
            newnode = (Node)calloc(1, sizeof(node)); /* 新增一结点, 并初始化 */
            current->child[index] = newnode;
            current = newnode; /* 改动当前的结点的位置 */
            current->n = 1; /* 此新单词出现一次 */
        }
    }
}
/* 在字典树中查找单词 */
int find_word(char *str)
{
    int i, index, len;
    Node current = NULL;

    len = strlen(str);

    current = root; /* 查找从根结点開始 */
    for (i = 0; i < len; i++)
    {
        index = str[i] - FIRST_CHAR; /* 获取此字符的下标 */
        if (current->child[index] != NULL) /* 当前字符存在字典树中 */
        {
            current = current->child[index]; /* 改动当前结点的位置 */
        }
        else
        {
            return ZERO; /*还没比較完就出现不匹配, 字典树中没有此单词*/
        }
    }

    if((current->n)>1) return  1;
    return 0;
}
void release(Node root)
{
     int i;

      if (NULL == root)
    {
        return;
    }

    for (i = 0; i < 20; i++)
    {
        if ( root->child[i] != NULL )
        {
            release( root->child[i] );
        }
    }

    free( root );
    root = NULL;
}

int main()
{
    int i,n,m,check;

     scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&m);
         root = (Node)calloc(1, sizeof(node));
        for(i=0;i<m;i++)
        {
          scanf("%s",num[i]);
          insert(num[i]);
        }
        check=0;
       for(i=0;i<m;i++)
        {
           if(find_word(num[i]))
            {
              check=1;
              break;
            }
        }
        if(check==1)
          printf("NO\n");
        if(check==0)
          printf("YES\n");
        release(root);
    }
    return 0;
}
时间: 2024-08-03 12:56:38

zoj 2876 Phone List的相关文章

概率dp ZOJ 3640

Help Me Escape Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Practice ZOJ 3640 Appoint description:  System Crawler  (2014-10-22) Description Background     If thou doest well, shalt thou not be accepted? an

zoj 2156 - Charlie&#39;s Change

题目:钱数拼凑,面值为1,5,10,25,求组成n面值的最大钱币数. 分析:dp,01背包.需要进行二进制拆分,否则TLE,利用数组记录每种硬币的个数,方便更新. 写了一个 多重背包的 O(NV)反而没有拆分快.囧,最后利用了状态压缩优化 90ms: 把 1 cents 的最后处理,其他都除以5,状态就少了5倍了. 说明:貌似我的比大黄的快.(2011-09-26 12:49). #include <stdio.h> #include <stdlib.h> #include <

ZOJ 1718 POJ 2031 Building a Space Station 修建空间站 最小生成树 Kruskal算法

题目链接:ZOJ 1718 POJ 2031 Building a Space Station 修建空间站 Building a Space Station Time Limit: 2 Seconds      Memory Limit: 65536 KB You are a member of the space station engineering team, and are assigned a task in the construction process of the statio

ZOJ 3607 Lazier Salesgirl (贪心)

Lazier Salesgirl Time Limit: 2 Seconds      Memory Limit: 65536 KB Kochiya Sanae is a lazy girl who makes and sells bread. She is an expert at bread making and selling. She can sell the i-th customer a piece of bread for price pi. But she is so lazy

ZOJ - 2243 - Binary Search Heap Construction

先上题目: Binary Search Heap Construction Time Limit: 5 Seconds      Memory Limit: 32768 KB Read the statement of problem G for the definitions concerning trees. In the following we define the basic terminology of heaps. A heap is a tree whose internal n

ZOJ 2859 二维线段树

思路:自己写的第二发二维线段树1A,哈哈,看来对二维的push操作比较了解了:但是还没遇到在两个线段树中同时进行push操作的,其实这题我是想在x维和y维同时进行push操作的,但是想了好久不会,然后看到这题又给出10秒,然后想想在x维线段直接单点查询肯定也过了,然后在第二维就只有pushup操作,在第一维线段树没有pushup操作.要是在第一维也有pushup操作的话,那就不用单点查询那么慢了.不过也A了,想找题即在二维同时进行pushup和pushdown操作的. #include<iost

ZOJ 2588

求一个无向图的桥(可能存在重边),输出割边的数目,并按顺序输出割边的序号(输入的顺序). 由于内存的限制 , 无法使用邻接矩阵 , 只能用邻接表了 . 第一次用了邻接表,超内存了: 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <string.h> 5 using namespace std; 6 const int N=10002; 7 const i

ZOJ 2587 Unique Attack 判断最小割是否唯一

很裸的判断最小割是否唯一.判断方法是先做一遍最大流求最小割,然后从源点和汇点分别遍历所有能够到达的点,看是否覆盖了所有的点,如果覆盖了所有的点,那就是唯一的,否则就是不唯一的. #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostr

ZOJ 3794 Greedy Driver spfa

题意: 给定n个点,m条有向边,邮箱容量. 起点在1,终点在n,开始邮箱满油. 下面m行表示起点终点和这条边的耗油量(就是长度) 再下面给出一个数字m表示有P个加油站,可以免费加满油. 下面一行P个数字表示加油站的点标. 再下面一个整数Q 下面Q行 u v 表示在u点有销售站,可以卖掉邮箱里的任意数量的油,每以单位v元. 问跑到终点能获得最多多少元. 先求个每个点的最大剩余油量 f[i], 再把边反向,求每个点距离终点的最短路 dis[i]. 然后枚举一下每个销售点即可,( f[i] - dis