"Strcmp()" Anyone? UVA - 11732

自己不会写,借用别人的题解,详情点击:题解 , 原题解没有具体的解释,我想强行解释一波偷笑

#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
const int maxn=4000001;
int sz;
int trie[maxn][62],time[maxn],isEnd[maxn];//time[i]=k表示第i个结点经过了k个单词,isEnd[j]=k表示以第j个结点结束的单词有k个
long long ans;
int getId(char c)
{
		if(c>='0'&&c<='9')return c-'0';
		else if(c>='A'&&c<='Z')return c-55;
		else return c-61;
}
void insert(char temp[])
{
	int u=0,id;
	for(int i=0;temp[i];i++)
	{
		id=getId(temp[i]);
		if(!trie[u][id])
		{
			memset(trie[sz],0,sizeof(trie[sz]));
			trie[u][id]=sz++;
			ans+=time[u]*(2*i+1);//这种情况是u结点下有多个子结点,设此时有n个子结点,当出现新的子结点时,
                                             //新的子结点需要与其它n个结点比较,总的比较次数为n*(2*i+1),i为新结点在temp串的位置。
}
		else ans+=(time[u]-time[trie[u][id]])*(2*i+1);//因为一个父结点有许多子结点,所以会出现父子结点出现次数不一致的现象,父结
                                    //出现的次数减去子结点出现的次数(经过父结点出去temp串的串的个数)乘以子结点在temp串的位置就是比较次数。
		time[u]++;
		u=trie[u][id];
	}
	int l=strlen(temp);
	ans+=isEnd[u]*2*(l+1);//出现相同的单词需要比较的次数
	ans+=(time[u]-isEnd[u])*(2*l+1);//一个单词包含在另一个单词里面需要比较的次数。
	time[u]++;
	isEnd[u]++;
}
int main()
{
	int n;
	int cas=1;
	while(scanf("%d",&n)&&n)
	{
		memset(time,0,sizeof(time));
		memset(isEnd,0,sizeof(isEnd));
		char temp[1000];
		memset(trie[0],0,sizeof(trie[0]));
		sz=1;
		ans=0;
		for(int i=0;i<n;i++)
		{
			scanf("%s",temp);
			insert(temp);
		}
		printf("Case %d: %lld\n",cas++,ans);
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值