纪念第一次省赛---Shortest Names

第一次省赛草草结束····留下了无数的遗憾···这在省赛卡到的题目···因为自己比较紧张 把 ‘a’  打成了 ‘A’   导致 第一个输入的总是对的  第二次 一样的数据也会错····一直以为是初始化问题···认为指针混乱···总之留下了无数的遗憾···真心对不起自己的队友···下面贴代码····

#include<iostream>
#include<stdio.h>
using namespace std;

struct Node
{
       int level;
       int match;
       Node * Child[26];
}node[1000010];
int rear;
char str[1000010];

void Clear(int j)
{
     for(int i = 0;i<26;i++)
     node[j].Child[i] = NULL;
     node[j].match = 0;
}

void Add(int i)
{
     Node * p = node;
     while(str[i]!='\0')
     {
          //printf("%d match :%d\n",p -> level,p -> match);
          if ( p->Child[ str[i] - 'a' ] == NULL )
          {
             Clear(rear);
             node[rear].level = i + 1;
             p -> Child[ str[i] - 'a' ] = &node[rear++];
          }
          p = p -> Child[ str[i] - 'a' ];
          p -> match ++;
          i++;
     }
}

int dfs(Node * p)
{
    if( p -> match == 1 ) return p -> level;
    int ans = 0;
    for ( int i = 0;i < 26;i++)
    if( p -> Child[i] != NULL )
    ans += dfs( p -> Child[i] );
    return ans;
}

int main()
{
    int t,n;
    scanf("%d",&t);
    while (t--)
    {
          scanf("%d",&n);
          Clear( 0 );
          rear = 1;
          node[0].level = 0;
          for (int i = 0;i<n;i++)
          {
              scanf("%s",str);
              Add(0);
          }
          printf("%d\n",dfs(&node[0]));
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值