【字典树】Message Flood - 第9届中山大学程序设计竞赛预选赛

Message Flood

Time Limit: 1500MS Memory limit: 65536K

题目描述

Well, how do you feel about mobile phone? Your answer would probably be something like that "It's so convenient and benefits people a lot". However, If you ask Merlin this question on the New Year's Eve, he will definitely answer "What a trouble! I have to keep my fingers moving on the phone the whole night, because I have so many greeting message to send!" Yes, Merlin has such a long name list of his friends, and he would like to send a greeting message to each of them. What's worse, Merlin has another long name list of senders that have sent message to him, and he doesn't want to send another message to bother them Merlin is so polite that he always replies each message he receives immediately). So, before he begins to send message, he needs to figure to how many friends are left to be sent. Please write a program to help him. Here is something that you should note. First, Merlin's friend list is not ordered, and each name is alphabetic strings and case insensitive. These names are guaranteed to be not duplicated. Second, some senders may send more than one message to Merlin, therefore the sender list may be duplicated. Third, Merlin is known by so many people, that's why some message senders are even not included in his friend list.

输入

There are multiple test cases. In each case, at the first line there are two numbers n and m (1<=n,m<=20000), which is the number of friends and the number of messages he has received. And then there are n lines of alphabetic strings(the length of each will be less than 10), indicating the names of Merlin's friends, one per line. After that there are m lines of alphabetic strings, which are the names of message senders. The input is terminated by n=0.

输出

For each case, print one integer in one line which indicates the number of left friends he must send.

示例输入

5 3
Inkfish
Henry
Carp
Max
Jericho
Carp
Max
Carp
0

示例输出

3

字典树。。


#include <stdio.h>
#include <string.h>
#include <malloc.h>

typedef struct NODE
{
    short IsEnd;
    short IsShow;
    struct NODE *pNext[30];
}NODE,*PNODE;


void Init(PNODE *pRoot);
void Delete(PNODE pRoot); /* 删除树 */
PNODE CreateNode(); /* 创建新结点 */
void Insert(PNODE *pRoot,char *s); /* 插入 */
int Search(PNODE *pRoot,char *s); /* 查找 */
char ToLow(char c); /* 输入转化为小写字母 */

int main()
{
    PNODE pRoot = NULL;
    Init(&pRoot);

    char list[50];
    int N,M;
    int n,m;
    int tot;
    while(scanf("%d",&N) != EOF && N)
    {
        n = N;
        scanf("%d",&M);
        m = M;
        tot = 0;

        while(n--)
        {
            scanf("%s",list);
            Insert(&pRoot,list);
        }

        while(m--)
        {
            scanf("%s",list);
            if(Search(&pRoot,list))
                tot++;
        }

        printf("%d\n",N - tot);
        Delete(pRoot);
        Init(&pRoot);

    }

    return 0;
}

char ToLow(char c)
{
    if(c >= 'A' && c <= 'Z')
        return c + 32;
    return c;
}

void Delete(PNODE pRoot)
{
    int i;

    for(i = 0 ; i < 30 ; ++i)
    {
        if(pRoot->pNext[i] != NULL)
            Delete(pRoot->pNext[i]);
    }

    free(pRoot);
}

int Search(PNODE *pRoot,char *s)
{
    int i,k;
    PNODE p = *pRoot;

    if(!p)
        return 0;

    i = 0;
    while(s[i])
    {
        k = ToLow(s[i++]) - 'a';
        if(!p->pNext[k]) /* 没有出现过 */
            return 0;
        p = p->pNext[k];
    }

    if(1 == p->IsEnd && 0 == p->IsShow)
    {
        p->IsShow = 1;
        return 1;
    }
    else
        return 0;
}

void Insert(PNODE *pRoot,char *s)
{
    PNODE p = *pRoot;
    int i,k;

    if(!p)
        p = *pRoot = CreateNode();

    i = 0;
    while(s[i])
    {
        /* 找到相应的分支 */
        k = ToLow(s[i++]) - 'a';

        if(!p->pNext[k]) /* 如果此孩子为空,则创建 */
        {
            p->pNext[k] = CreateNode();
        }
        p = p->pNext[k];
    }
    p->IsEnd = 1;

}

PNODE CreateNode()
{
    PNODE p;
    int i;

    p = (PNODE)malloc(sizeof(NODE));
    p->IsEnd = 0;
    p->IsShow = 0;

    for(i = 0 ; i < 30; ++i)
        p->pNext[i] = NULL;

    return p;
}

void Init(PNODE *pRoot)
{
    (*pRoot) = NULL;
}


转载于:https://www.cnblogs.com/whongfei/archive/2013/02/20/5247003.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`iptables pingflood-IN`通常是指在Linux系统中配置iptables规则来阻止ping洪泛攻击进入特定网络设备(如路由器或防火墙)。iptables是一个强大的包过滤工具,用于在Linux内核中控制网络数据包的流向。 ### 简介 iptables通过在内核级别的规则表上设置规则来管理数据包流量,它可以进行链路筛选、源地址限制等多种功能。在网络安全策略中,经常需要使用iptables来防御各种类型的攻击,包括但不限于ping洪泛攻击。 ### 防御ping洪泛攻击的iptables规则示例 为了防御ping洪泛攻击,可以创建一条iptables规则禁止特定IP地址向目标主机发起ping请求。以下是基本的iptables命令行结构: ```bash sudo iptables -A INPUT -p icmp --icmp-type echo-request -s <source_ip> -j DROP ``` 这里的参数说明如下: - `sudo`: 使用管理员权限运行iptables命令。 - `-A INPUT`: 将规则添加到INPUT链,这表示只允许接收的数据包经过此规则检查。 - `-p icmp`: 指定处理ICMP协议的数据包。 - `--icmp-type echo-request`: 这是发送PING请求的ICMP类型标识符(Type 8)。 - `-s <source_ip>`: 只针对来自特定IP地址的包。 - `-j DROP`: 表明将匹配的包丢弃,即拒绝接收来自该IP地址的所有PING请求。 ### 应用场景 1. **部署安全服务器**:在网络环境中,服务器可能会受到频繁的ping洪泛攻击,导致网络拥塞并影响正常服务。通过上述iptables规则,可以有效隔离这样的攻击。 2. **企业内部网络防护**:对于有严格安全需求的企业内部网络,防止从外部对内部服务器发起的恶意Ping尝试也很重要。 ### 注意事项 1. **权衡性能**:虽然iptables能提供强大的安全保护,但也可能导致一定的CPU开销和延迟,特别是在高流量网络环境下。 2. **测试与监控**:在实施新的iptables规则之前,应先在非关键环境中测试其效果,并持续监控网络流量,确保不会误拦截正常的通信。 3. **定期更新规则**:随着网络威胁的不断演变,可能需要调整iptables规则以应对最新的攻击手段。 --- ### 相关问题: 1. 怎么确定是否有正在进行的ping洪泛攻击? 2. iptables的其他常用规则有哪些? 3. 在设置iptables规则时需要注意哪些常见陷阱?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值