题目链接:http://acm.csust.edu.cn/problem/4001
博客园食用链接:https://www.cnblogs.com/lonely-wind-/p/13412300.html
Description

众所周知,LJ精通 1 + 1 1+1 1+1 和 1 + 2 1 + 2 1+2, 这天他遇到一个简单的加法题,但这个加法有一个特殊的性质,它是不进位加法,

比如当是10进制时 987 + 643 = 520 987 + 643 = 520 987+643=520 ,当一位大于 10 10 10 的时候我们我们对其模 10 10 10 ,取余数作为这位的值, k k k 进制数同理。

现在给你 n n n 个数 ( 1 ≤ n ≤ 1 e 5 ) (1 \leq n \leq 1e5) (1≤n≤1e5),并且每个数最多只有 10 10 10位,然后给定一个 k ( 2 ≤ k ≤ 10 ) k (2 \leq k \leq 10) k(2≤k≤10) ,代表所有数都是 k k k 进制数,

接下来有 q q q 次询问 ( 1 ≤ q ≤ 1 e 5 ) (1 \leq q \leq 1e5) (1≤q≤1e5) ,每次询问给你一个长度不超过 10 10 10 的 k k k 进制数,你需要在 n n n 个数中找到一个数和它进行

不进位加法时所得到的值最大,输出这个最大值。佳爷觉得这题太水了,就出给同学们做了。

Input
第一行两个正整数 n ( 1 ≤ n ≤ 1 e 5 ) n (1 \leq n \leq 1e5) n(1≤n≤1e5), k ( 2 ≤ k ≤ 10 ) k (2 \leq k \leq 10) k(2≤k≤10)。

第二行 n n n 个整数,每个整数最多只有 10 10 10 位。

第三行一个整数 q q q , ( 1 ≤ q ≤ 1 e 5 ) (1 \leq q \leq 1e5) (1≤q≤1e5)
接下来有 q q q 行,代表 q q q 次询问,每次给你一个位数不超过 10 10 10 的整数。

Output
输出有 q q q 行,每行对应一个询问的所求的最大值

Sample Input 2
4 10
998
997
886
885
4
991
998
119
190

Sample Output 2
889
886
995
976

emmm,比赛的时候似乎想到了字典树。。。不过好像就出现了一秒就被我抛了。。。然后我就一直用二分艹。。。。

QAQ要是我能坚定一下我的字典树的话这题也就过了。。。

如果能够看出是字典树的话,我们就知道,字典树的操作只有两种,一个是insert,一个是find,那么毫无疑问我们当然是直接将n个字符串全部插入到字典树里面的,不过为了后面的计算,我们要将每个数字补足10位,这样的话等会找的时候才能好找。

接下来找的话我们先预处理出每个数字在k进制下的需要匹配的最大数的排名,我们爬链找就是按照这个排名顺序来找的,如下所示:

ll find(char *s,int rt,int k) {ll ans=0;int ch[15];int nb=0;for(int i=0; s[i]; i++) {int x=s[i]-'0';for (int j=0; j<10; j++){//枚举排名if (trie[rt][ranks[x][j]]) {ch[nb++]=ranks[x][j]+x;rt=trie[rt][ranks[x][j]];break;}}}for (int i=0; i<10; i++){ans=ans*10+(ch[i]%k);}return ans;
}
********
scanf ("%d%d",&n,&k);
for (int i=0; i<k; i++) {for (int j=0; j<k; j++) {ranks[i][j]=(k-1-i-j+k)%k;}
}

于是,此题便结束了。。。。QAQ

以下是AC代码:

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
const int mac=2e6+10;int trie[mac][12],mark[mac];
int ranks[12][12],tot=0;void insert(char *s,int rt) {for(int i=0; s[i]; i++) {int x=s[i]-'0';if(trie[rt][x]==0) {   //现在插入的字母在之前同一节点处未出现过trie[rt][x]=++tot;   //字母插入一个新的位置}rt=trie[rt][x];   //为下个字母的插入做准备}mark[rt]=1;      //对该节点标记为结束(代表再次链上以此字母为结尾的存在)
}ll find(char *s,int rt,int k) {ll ans=0;int ch[15];int nb=0;for(int i=0; s[i]; i++) {int x=s[i]-'0';for (int j=0; j<10; j++){if (trie[rt][ranks[x][j]]) {ch[nb++]=ranks[x][j]+x;rt=trie[rt][ranks[x][j]];break;}}}for (int i=0; i<10; i++){ans=ans*10+(ch[i]%k);}return ans;
}char s[15],s1[15];int main(int argc, char const *argv[])
{int n,k;scanf ("%d%d",&n,&k);for (int i=0; i<k; i++){for (int j=0; j<k; j++){ranks[i][j]=(k-1-i-j+k)%k;}}for (int i=1; i<=n; i++){scanf ("%s",s);int len=strlen(s);if (len<10) for (int j=0; j<10-len; j++)s1[j]='0';for (int j=10-len,cnt=0; j<10; j++,cnt++) s1[j]=s[cnt];insert(s1,0);}int q;scanf ("%d",&q);while (q--){scanf ("%s",s);int len=strlen(s);if (len<10) for (int j=0; j<10-len; j++)s1[j]='0';for (int j=10-len,cnt=0; j<10; j++,cnt++) s1[j]=s[cnt];ll ans=find(s1,0,k);printf("%lld\n",ans);}return 0;
}

CSUST 4001-你真的会加法吗?(不进位加法-字典树)相关推荐

  1. 十几加几不进位加法题C语言,十几加几(不进位))的加法教案

    <十几加几(不进位))的加法教案>由会员分享,可在线阅读,更多相关<十几加几(不进位))的加法教案(6页珍藏版)>请在人人文库网上搜索. 1.十几加几(不进位)的加法[教学内容 ...

  2. RPD and Rap Sheet (Hard Version)(交互题,不进位加法、不退位减法)

    传送门 题目: 定义 a⊕kba \oplus_k ba⊕k​b表示整数 aaa 与 bbb的在 kkk进制下的不进位加法.特别的,当 k=2k = 2k=2 时,这一操作可以称为位运算的异或. 给定 ...

  3. html中加法,javascript 实现加法运算详解

    例子,javascript 实现加法运算. 复制代码 代码示例: javascript 实现加法运算 function calsum(){ var a=parseint(document.getele ...

  4. java分数的加法_分数加法

    分数加法 时间限制 : 1sec / 空间限制: 256MB 题意: 给你2个分数,求他们的和,并要求和为最简形式. 输入: 一行,包含四个正整数a,b,c,d(0 输出: 输出两个整数e和f,用一个 ...

  5. c语言10以内得加法,10以内加法练习题(最新整理)

    <10以内加法练习题(最新整理)>由会员分享,可在线阅读,更多相关<10以内加法练习题(最新整理)(48页珍藏版)>请在人人文库网上搜索. 1.0+0=1+5=9+0=1+0= ...

  6. 实数加法 小数高精度加法 c++ vector实现

    题目地址: [Vjudge] https://vjudge.net/problem/%E8%AE%A1%E8%92%9C%E5%AE%A2-T1180 [计蒜客] 实数加法 - 题库 - 计蒜客 (j ...

  7. 矩阵 python 加法_Python矩阵加法

    矩阵 python 加法 Here you will get program for python matrix addition. In python "list" concep ...

  8. PAT甲级1002 A+B for Polynomials:[C++题解]字符串、多项式加法或高精度加法

    文章目录 题目分析 题目链接 题目分析 本题数据范围是1000 ,可以开一个数组 X [ ] ,X[i ]表示多项式中次幂是i的系数是多少. 因此,本题可以开两个数组,对应相加,然后输出非零项即可. ...

  9. python高精度加法_14.高精度加法

    作者:X3B0A1 1.0 问题 在我们熟悉的数据类型中,能够储存的最大的数也只是longlong的范围. 虽然有些编译器也提供__int128类型,但是最多也只能表示40位左右的数,大小依然有限,而 ...

最新文章

  1. 微信小程序 延迟执行
  2. Centos新建系统用户详解
  3. 平安智慧城市:与时代同行,坚定数字化之路
  4. 前后端分离时代,Java 程序员的变与不变!
  5. html converttopdf无法换行_超文本标记语言的段落与换行显示!
  6. {面试题49} 把字符串转换成整数
  7. 移动应用ios和网页应用_如何在iOS上一次移动多个应用
  8. 李嘉诚无锡演讲:骂到你成功
  9. 基于JAVA+SpringMVC+MYSQL的在线音乐网站
  10. 介绍一些房屋抗震的科普知识
  11. 垂直居中小记 line-height table vertical-align:middle
  12. [WPF] 托盘菜单的基本功能实现
  13. svn 删除文件 上传文件
  14. 【设计模式】-工厂模式->抽象工法模式(源码与类图解析)
  15. 华硕电脑键盘灯不亮怎么办
  16. IT项目管理追踪表格
  17. 笔记本共享台式机上网
  18. python实现百度语音合成(超详细!!)
  19. 在Windows环境下编译VPX
  20. java 同比数据怎么算的_有当日数据和去年全年数据,如何通过公式做每日同比?...

热门文章

  1. python自带的库有哪些_anaconda 包含哪些库?
  2. spring5 webflux
  3. SVN本地服务器搭建教程
  4. Thinkphp5.1 合并后的数组进行排序之后分页
  5. “欠缺逻辑”的诺奖得主:我有更好的直觉
  6. 设置linux时间为北京时间
  7. 什么神仙操作?字节跳动年轻技术官发表“高分宝典”,GitHub已上热门
  8. 网络抓包神器-Charles使用指南
  9. RemoteApp Tool
  10. python消息队列中间件_常见的消息队列中间件介绍