思路

有点麻烦的Trie树题

注意到每个节点的贡献是(深度(根的深度是0)乘2+1)乘上在这个点分叉的字符串个数,所以全部插入之后dfs一遍即可(为了避免两个字符串一样的情况,还应该特判一下最后的中止节点)

代码

字符集太大需要用邻接表存才能跑过

直接存边的TLE代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <set>
#define int long long
using namespace std;
signed Trie[4000100][65];
int Nodecnt,sz[4000100],ans=0,root,n;
char s[4010][1010];
int tonum(char c){if(c>='a'&&c<='z')return c-'a';else if(c=='a'+26)return 26;else if(c>='A'&&c<='Z')return c-'A'+27;else if(c>='0'&&c<='9')return c-'0'+54;
}
void insert(char *s,int len){int o=root;sz[o]++;for(int i=0;i<len;i++){if(!Trie[o][tonum(s[i])])Trie[o][tonum(s[i])]=++Nodecnt;o=Trie[o][tonum(s[i])];sz[o]++;}
}
void dfs(int o,int dep,int isend=0){if(!isend){int midt=0;for(int i=0;i<65;i++){if(Trie[o][i]){sz[o]-=sz[Trie[o][i]];midt+=sz[Trie[o][i]]*sz[o];}}ans+=(dep+1)*midt;for(int i=0;i<65;i++){if(Trie[o][i]){dfs(Trie[o][i],dep+2,(i==26));}}}else{ans+=(sz[o]-1)*(sz[o])/2*dep;}
}
void init(void){for(int i=0;i<=Nodecnt;i++){for(int j=0;j<65;j++)Trie[i][j]=0;sz[i]=0;}ans=0;Nodecnt=1;root=1;
}
signed main(){// freopen("test.in","r",stdin);// freopen("test.out","w",stdout);Nodecnt=1;root=1;ans=0;int cnt=0;while(scanf("%lld",&n)==1&&n){++cnt;for(int i=1;i<=n;i++){scanf("%s",s[i]+1);int len=strlen(s[i]+1);s[i][len+1]='a'+26;insert(s[i]+1,len+1);}dfs(root,0);printf("Case %lld: %lld\n",cnt,ans);init();}return 0;
}

邻接表存边的AC代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <set>
#define int long long
using namespace std;
signed fir[4000100],nxt[4000100],v[4000100],num[4000100],Ecnt=0;
int Nodecnt,sz[4000100],ans=0,root,n;
char s[4010][1010];
int tonum(char c){if(c>='a'&&c<='z')return c-'a';else if(c=='a'+26)return 26;else if(c>='A'&&c<='Z')return c-'A'+27;else if(c>='0'&&c<='9')return c-'0'+54;
}
void addedge(int ui,int vi){++Ecnt;v[Ecnt]=vi;nxt[Ecnt]=fir[ui];fir[ui]=Ecnt;
}
void insert(char *s,int len){int o=root;sz[o]++;for(int i=0;i<len;i++){int vx;bool f=false;for(int j=fir[o];j;j=nxt[j])if(num[v[j]]==tonum(s[i])){vx=v[j];f=true;break;}if(!f){vx=++Nodecnt;num[vx]=tonum(s[i]);addedge(o,vx);}o=vx;sz[o]++;}
}
void dfs(int o,int dep,int isend=0){if(!isend){int midt=0;for(int i=fir[o];i;i=nxt[i]){sz[o]-=sz[v[i]];midt+=sz[v[i]]*sz[o];}ans+=(dep+1)*midt;for(int i=fir[o];i;i=nxt[i]){dfs(v[i],dep+2,(num[v[i]]==26));}}else{ans+=(sz[o]-1)*(sz[o])/2*dep;}
}
void init(void){ans=0;Nodecnt=1;root=1;Ecnt=0;memset(sz,0,sizeof(sz));memset(fir,0,sizeof(fir));memset(nxt,0,sizeof(nxt));memset(v,0,sizeof(v));memset(num,0,sizeof(num));
}
signed main(){// freopen("test.in","r",stdin);// freopen("test.out","w",stdout);Nodecnt=1;root=1;ans=0;int cnt=0;while(scanf("%lld",&n)==1&&n){++cnt;for(int i=1;i<=n;i++){scanf("%s",s[i]+1);int len=strlen(s[i]+1);s[i][len+1]='a'+26;insert(s[i]+1,len+1);}dfs(root,0);printf("Case %lld: %lld\n",cnt,ans);init();}return 0;
}

转载于:https://www.cnblogs.com/dreagonm/p/10690046.html

UVA11732 strcmp() Anyone?相关推荐

  1. Trie(字典树)解析及其在编程竞赛中的典型应用举例

    摘要: 本文主要讲解了Trie的基本思想和原理,实现了几种常见的Trie构造方法,着重讲解Trie在编程竞赛中的一些典型应用. 什么是Trie? 如何构建一个Trie? Trie在编程竞赛中的典型应用 ...

  2. php 比较字符串差,PHP字符串比较函数strcmp()和strcasecmp()使用总结

    比较字符串是任何编程语言的字符串处理功能中重要的特性之一.在PHP中除了可以使用比较运算符号(==.)加以比较外,还提供了一系列的比较函数,使PHP可以进行更复杂的字符串比较.如strcmp().st ...

  3. 模拟实现: strstr strcpy strlen strcat strcmp memcpy memmove

    模拟实现: strstr strcpy strlen strcat strcmp memcpy memmove ================================ 1 strstr 字符 ...

  4. 转:strcat与strcpy与strcmp与strlen

    转自:http://blog.chinaunix.net/uid-24194439-id-90782.html strcat 原型:extern char *strcat(char *dest,cha ...

  5. (C++)strlen(),strcmp(),strcpy(),strcat()用法

    string.h中包含了许多用于字符数组的函数.使用前需要在程序开头加string.h©或cstring(C++)头文件 strlen() 作用:得到字符数组第一个结束符\0前的字符的个数 #incl ...

  6. C/C++中strlen(),strcpy(),strcat()以及strcmp()的代码实现--学习笔记

    以下代码是自己学习过程中通过借鉴加上自己的理解编写出的代码已经在VC++2008版本上调试通过,主函数因为很简单所以没有附上. 1. strlen() int my_strlen(char *str) ...

  7. C语言不用strcmp函数比较字符串大小

    C语言不用strcmp函数比较字符串大小 #include <stdio.h> int main(){int i, res;char s1[100], s2[100];printf(&qu ...

  8. strcmp函数和strcpy函数

    (一)strcmp函数 strcmp函数是比較两个字符串的大小,返回比較的结果.一般形式是: i=strcmp(字符串,字符串); 当中,字符串1.字符串2均可为字符串常量或变量:i   是用于存放比 ...

  9. c语言p gt name,c语言中strcmp(p-name,s)是什么意思?

    c语言中strcmp(p->name,s)是什么意思?0 cg4tf2q52016.06.28浏览142次分享举报 网上看的c语言做学生管理表中的一个查找函数,其中有一段判断输入的名字与管理表中 ...

最新文章

  1. 使用npm link 创建本地模块
  2. ORACLE---数据库巡检
  3. java吃豆游戏_利用java编写的精灵吃豆的游戏
  4. 面试题:sql数据查询
  5. 高效实用Kafka-深入理解Kafka启动配置(使用kafka自身内置Zookeeper)
  6. java的outputstream_Java OutputStream类
  7. laravel路由和MVC
  8. redis主从和持久化
  9. Node rabbitmq 入门就够了
  10. steam加速_PC电脑steam有没有免费试用的加速器?首选电狐加速器
  11. simulink如何更新版本的文件(mdl或slx),How to load models created with a newer version of Simulink
  12. 把你的桌面变成vista
  13. latex怎么改字体大小_latex更改字体 latex局部字体大小
  14. 微信生成带参数二维码以及获取此二维码参数
  15. js将数字的金额转换成中文大写金额
  16. flutter引入高德地图_Flutter接入高德地图后运行报错
  17. Theorem、Proposition、Lemma的区别
  18. itunes将m4a转mp3
  19. macbook打印出现乱码解决方案
  20. 漫画:二分法系列篇(第一讲)

热门文章

  1. kubeasz_使用kubeasz安装K8S集群,不受国内网络环境影响
  2. linux日期日增,Linux日期
  3. c语言实验报告超市购物系统,C语言超市购物管理系统的报告.doc
  4. java产生全局唯一的int类型_全局唯一ID设计
  5. flask_sqlalchemy 教程
  6. 三十六、请求分页管理方式
  7. caffe 的命令行训练与测试
  8. 大角度人脸转正--Towards Large-Pose Face Frontalization in the Wild
  9. android fadingedge,Android:从滚动条中仅删除底部的FadingEdge效果
  10. 构建弹性架构组件—ELB和ASG