uva 11732 strcmp() Anyone?
https://vjudge.net/problem/UVA-11732
题意:
给出许多字符串,他们两两按下面的函数比较
输出比较次数
s[i]==t[i] , 和 s[i]=='\0' 各算一次比较
法一:
每两个字符串,要么全部匹配,要么中间停止匹配
如果全部匹配,比较次数为 2*len+2(‘\0’两次匹配)
如果中间停止匹配,比较次数为 2*相同前缀长度+1 (1次失败匹配后退出)
所以
1、对于第i个字符串,先加上i-1,即假设全部 中间停止匹配
这样最后再加上全部匹配数
2、匹配一个就+sum*2
#include<cstdio> #include<cstring> #define N 1001 using namespace std;char s[N]; int sum[N*4001],len,trie[N*4001][63],tot; long long ans; int mark[N*4001];int get(int i) {if(s[i]>='0'&&s[i]<='9') return s[i]-'0';if(s[i]>='a'&&s[i]<='z') return s[i]-'a'+10;if(s[i]>='A'&&s[i]<='Z') return s[i]-'A'+36; } void insert(int cnt) {int root=0,id;ans+=cnt;for(int i=0;i<len;i++){id=get(i);if(!trie[root][id]) {trie[root][id]=++tot;memset(trie[tot],0,sizeof(trie[tot]));sum[tot]=mark[tot]=0;}root=trie[root][id];ans+=sum[root]<<1;sum[root]++;}ans+=mark[root];mark[root]++; } int main() {int n,t=0;while(scanf("%d",&n)!=EOF){if(!n) return 0;memset(trie[0],0,sizeof(trie[0]));ans=0;tot=0;for(int i=1;i<=n;i++){scanf("%s",s);len=strlen(s);insert(i-1);}printf("Case %d: %lld\n",++t,ans);} }
View Code
法二:
用cnt记录现在还剩下几个是匹配的
那么每次
1、ans+=cnt-sum 匹配失败
2、ans+=sum*2 匹配成功
3、cnt=sum
注意:为了好处理,所以字符串的结束符也算上了
那么这就要循环到len,另外特殊给‘\0’赋一个id
#include<cstdio> #include<cstring> #define N 1001 using namespace std;char s[N]; int sum[N*4001],len,trie[N*4001][63],tot; long long ans;int get(int i) {if(s[i]>='0'&&s[i]<='9') return s[i]-'0';if(s[i]>='a'&&s[i]<='z') return s[i]-'a'+10;if(s[i]>='A'&&s[i]<='Z') return s[i]-'A'+36;return 62; } void insert(int cnt) {int root=0,id;for(int i=0;i<=len;i++){id=get(i);if(!trie[root][id]) {trie[root][id]=++tot;memset(trie[tot],0,sizeof(trie[tot]));sum[tot]=0;}root=trie[root][id];ans+=cnt-sum[root];ans+=sum[root]<<1;cnt=sum[root];sum[root]++;} } int main() {int n,t=0;while(scanf("%d",&n)!=EOF){if(!n) return 0;memset(trie[0],0,sizeof(trie[0]));ans=0;tot=0;for(int i=1;i<=n;i++){scanf("%s",s);len=strlen(s);insert(i-1);}printf("Case %d: %lld\n",++t,ans);} }
View Code
转载于:https://www.cnblogs.com/TheRoadToTheGold/p/6958455.html
uva 11732 strcmp() Anyone?相关推荐
- UVA 11732 - strcmp() Anyone?(Trie)
UVA 11732 - strcmp() Anyone? 题目链接 题意:给定一些字符串,要求两两比較,须要比較的总次数(注意.假设一个字符同样.实际上要还要和'\0'比一次,相当比2次) 思路:建T ...
- Uva 11732 strcmp()函数
题目链接:https://vjudge.net/contest/158125#problem/A 题意: 系统中,strcmp函数是这样执行的,给定 n 个字符串,求两两比较时,strcmp函数要比较 ...
- UVA - 11732 strcmp() Anyone?左兄弟右儿子trie
input n 2<=n<=4000 s1 s2 ... sn 1<=len(si)<=1000 output 输出用strcmp()两两比较si,sj(i!=j)要比较的次数 ...
- uva 11732 - strcmp() Anyone? 不错的Trie题
题解:http://blog.csdn.net/u013480600/article/details/23122503 我的代码一直TLE,,,看了人家的之后,认为1.链式前向星比較好,2.*dept ...
- UVa 11732 (Tire树) strcmp() Anyone?
这道题也是卡了挺久的. 给出一个字符串比较的算法,有n个字符串两两比较一次,问一共会有多少次比较. 因为节点会很多,所以Tire树采用了左儿子右兄弟的表示法来节省空间. 假设两个不相等的字符串的最长公 ...
- strcmp() Anyone? UVA - 11732 左孩子右兄弟Trie/计数
#include<bits/stdc++.h> using namespace std; #define ll long longconst int maxnode = 4000 * 10 ...
- Trie(字典树)解析及其在编程竞赛中的典型应用举例
摘要: 本文主要讲解了Trie的基本思想和原理,实现了几种常见的Trie构造方法,着重讲解Trie在编程竞赛中的一些典型应用. 什么是Trie? 如何构建一个Trie? Trie在编程竞赛中的典型应用 ...
- UVA 10515 - Powers Et Al.(数论)
UVA 10515 - Powers Et Al. 题目链接 题意:求出m^n最后一位数 思路:因为m和n都非常大,直接算肯定是不行的,非常easy想到取最后一位来算,然后又非常easy想到最后一位不 ...
- 【POJ3126 Prime Path】【POJ 3087 Shuffle'm Up】【UVA 11624 Fire!】【POJ 3984 迷宫问题】
POJ3126Prime Path 给定两个四位素数a b,要求把a变换到b 变换的过程要 每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数 与 前一步得到的素数 只能有一个位 ...
最新文章
- python lambda_Python 匿名函数 lambda
- 第7篇-JAVA面向对象Ⅲ
- 【教程】jQuery打造动态下滑菜单
- Spring5的系统架构
- Spyder打开报错解决办法
- pC机OracLe库磁盘坏如何恢复,电脑硬盘坏了数据能恢复吗(6步教你自己在家轻松恢复数据)...
- android 9 pie公司,Android 9.0正式推送 定名Android Pie
- kdj值应用口诀_KDJ买卖绝学!背熟它短线选股不用愁
- 异常总结2013-04
- 简约大方干净明亮“现代简约细体字体”
- Comic Life 3 for Mac(漫画创作工具)
- 二阶系统阶跃响应实验_二阶系统的阶跃响应实验报告
- kafka-linux集群搭建小结
- 超好看的QQ群管机器人html官网源码
- 易语言解压服务器中压缩包,易语言查看RAR文件_包括解压方法_精易论坛
- WPS公式编辑器快捷键
- Latex \TexStudio 设置数学符号
- 深圳大学计算机专业评级,泰晤士中国学科评级榜单2021 南科大上榜学科全为A
- 系统封装 EasyBoot如何将WIN7安装版提取到光盘
- 用Excel进行个人敏捷项目看板管理