UVa 11732-strcmp() Anyone?

由于数据规模的原因,需要用多叉树来构建Trie,即一个结点的子树通过一个子节点串起来,这样节省很多空间。本代码的Node.count为插入时搜索路径经过该结点的次数,表明多少个字符串在Trie相应的深度位置和当前字符串里的相应位置的字符相等,如果相等就要加上其次数乘上2,如果不相等直接加上其次数。

#include <cstdio>
#include <memory.h>
#include <cstring>
#define maxnode 4000005
#define LL long long
using namespace std;
struct Node{
	char ch;
	Node* brother;
	Node* child;
	int count;
};
Node map[maxnode];
class Trie{
public:
	Node* root;
	LL ans;
	int sz;
	void Initial(){
		sz=1;
		ans=0;
		root=NewNode(0);
	}
	Node* NewNode(char c){
		map[sz].ch=c;
		map[sz].brother=map[sz].child=NULL;
		map[sz].count=0;
		return &map[sz++];
	}
	void Trie_Insert(char str[],int n){
		Node* node=root->child,*last=root;
		bool flag;
		for(int i=0;i<=n;++i){
			flag=0;
			for(Node* next=node;next!=NULL;next=next->brother){
				if(next->ch==str[i]){
					flag=1;
					node=next;
					ans+=next->count*2;
				}else	ans+=next->count;
			}
			if(!flag){
				Node* temp=NewNode(str[i]);
				temp->brother=last->child;
				last->child=temp;
				node=temp;
			}
			node->count++;
			last=node;
			node=node->child;
		}
	}
};
int main(){
	int n,len=1;
	char str[1010];
	Trie trie;
	while(~scanf("%d",&n)){
		if(n==0)	break;
		getchar();
		trie.Initial();
		while(n--){
			gets(str);
			trie.Trie_Insert(str,strlen(str));
		}
		printf("Case %d: %lld\n",len++,trie.ans);
	}
	return 0;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值