[HIHO]hihoCoder太阁最新面经算法竞赛7

题目链接:http://hihocoder.com/contest/hihointerview12

期末完事了,终于有时间成套刷题了。这套题比较简单,难度上感觉和上一套差不多。除了最后一个题是看了讨论版说数据水才敢写的。

A Word Construction

解法:正解应该是dfs+剪枝,我的思路是贪心,竟然过了。先把字符串按字典序排序,然后枚举每一个串作为起始,记下串内有什么字符,再从头到尾枚举所有字符串,看看每一个是否符合条件。就那么100个字符串,数据弱得很。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <iomanip>
 4 #include <cstring>
 5 #include <climits>
 6 #include <complex>
 7 #include <cassert>
 8 #include <cstdio>
 9 #include <cstdlib>
10 #include <bitset>
11 #include <vector>
12 #include <deque>
13 #include <queue>
14 #include <stack>
15 #include <ctime>
16 #include <set>
17 #include <map>
18 #include <cmath>
19 using namespace std;
20 #define fr first
21 #define sc second
22 #define cl clear
23 #define BUG puts("here!!!")
24 #define W(a) while(a--)
25 #define pb(a) push_back(a)
26 #define Rint(a) scanf("%d", &a)
27 #define Rll(a) scanf("%I64d", &a)
28 #define Rs(a) scanf("%s", a)
29 #define Cin(a) cin >> a
30 #define FRead() freopen("in", "r", stdin)
31 #define FWrite() freopen("out", "w", stdout)
32 #define Rep(i, len) for(int i = 0; i < (len); i++)
33 #define For(i, a, len) for(int i = (a); i < (len); i++)
34 #define Cls(a) memset((a), 0, sizeof(a))
35 #define Clr(a, x) memset((a), (x), sizeof(a))
36 #define Full(a) memset((a), 0x7f7f7f, sizeof(a))
37 #define lrt rt << 1
38 #define rrt rt << 1 | 1
39 #define pi 3.14159265359
40 #define RT return
41 #define lowbit(x) x & (-x)
42 #define onenum(x) __builtin_popcount(x)
43 typedef long long LL;
44 typedef long double LD;
45 typedef unsigned long long ULL;
46 typedef pair<int, int> pii;
47 typedef pair<string, int> psi;
48 typedef pair<LL, LL> pll;
49 typedef map<string, int> msi;
50 typedef vector<int> vi;
51 typedef vector<LL> vl;
52 typedef vector<vl> vvl;
53 typedef vector<bool> vb;
54
55 const int maxn = 1000;
56 string s[maxn];
57 int n;
58 int ascii[256];
59
60 int main() {
61     // FRead();
62     while(~Rint(n)) {
63         Rep(i, n) cin >> s[i];
64         sort(s, s+n);
65         int ret = 0;
66         Rep(k, n) {
67             Cls(ascii);
68             Rep(j, s[k].length()) ascii[s[k][j]] = 1;
69             int cur = 1;
70             Rep(i, n) {
71                 bool flag = 0;
72                 Rep(j, s[i].length()) {
73                     if(ascii[s[i][j]] == 1) {
74                         flag = 1;
75                         break;
76                     }
77                 }
78                 if(flag == 0) {
79                     Rep(j, s[i].length()) ascii[s[i][j]] = 1;
80                     cur++;
81                 }
82             }
83             ret = max(ret, cur);
84         }
85         printf("%d\n", ret);
86     }
87     RT 0;
88 }

A

B Email Merge

解法:STL+并查集,这题很好想,但是写起来比较麻烦。对于字符串数组,想要做并查集操作的话,需要map<string, int>这样从字符串到整型的映射支持。读入数据按照邮箱为根节点,儿子是用户名,构建一个森林。这个时候同时更新并查集,也就是合并同一个树根下的所有用户名字符串。接着遍历所有用户名,扔到对应的belong中。我开的belong是堆,因为输出要求按照出现的顺序,所以堆序就是输入的顺序,也就是之前赋值的id号。

  1 #include <algorithm>
  2 #include <iostream>
  3 #include <iomanip>
  4 #include <cstring>
  5 #include <climits>
  6 #include <complex>
  7 #include <cassert>
  8 #include <cstdio>
  9 #include <cstdlib>
 10 #include <bitset>
 11 #include <vector>
 12 #include <deque>
 13 #include <queue>
 14 #include <stack>
 15 #include <ctime>
 16 #include <set>
 17 #include <map>
 18 #include <cmath>
 19 using namespace std;
 20 #define fr first
 21 #define sc second
 22 #define cl clear
 23 #define BUG puts("here!!!")
 24 #define W(a) while(a--)
 25 #define pb(a) push_back(a)
 26 #define Rint(a) scanf("%d", &a)
 27 #define Rll(a) scanf("%I64d", &a)
 28 #define Rs(a) scanf("%s", a)
 29 #define Cin(a) cin >> a
 30 #define FRead() freopen("in", "r", stdin)
 31 #define FWrite() freopen("out", "w", stdout)
 32 #define Rep(i, len) for(int i = 0; i < (len); i++)
 33 #define For(i, a, len) for(int i = (a); i < (len); i++)
 34 #define Cls(a) memset((a), 0, sizeof(a))
 35 #define Clr(a, x) memset((a), (x), sizeof(a))
 36 #define Full(a) memset((a), 0x7f7f7f, sizeof(a))
 37 #define lrt rt << 1
 38 #define rrt rt << 1 | 1
 39 #define pi 3.14159265359
 40 #define RT return
 41 #define lowbit(x) x & (-x)
 42 #define onenum(x) __builtin_popcount(x)
 43 typedef long long LL;
 44 typedef long double LD;
 45 typedef unsigned long long ULL;
 46 typedef pair<int, int> pii;
 47 typedef pair<string, int> psi;
 48 typedef pair<LL, LL> pll;
 49 typedef map<string, int> msi;
 50 typedef vector<int> vi;
 51 typedef vector<LL> vl;
 52 typedef vector<vl> vvl;
 53 typedef vector<bool> vb;
 54
 55 const int maxn = 100010;
 56 typedef struct Node {
 57     string d;
 58     int idx;
 59     Node() { idx = -1; }
 60     Node(string dd, int ii) : d(dd), idx(ii) {}
 61     friend bool operator<(Node a, Node b) { return a.idx > b.idx; }
 62 }Node;
 63
 64 string mail, user;
 65 bool vis[maxn];
 66 map<string, int> id;
 67 map<string, set<string> > wt;
 68 priority_queue<Node> belong[100010];
 69
 70 int n, m, cnt;
 71 int pre[maxn];
 72
 73 int find(int x) {
 74     return x == pre[x] ? x : pre[x] = find(pre[x]);
 75 }
 76
 77 void unite(int x, int y) {
 78     x = find(x); y = find(y);
 79     if(x < y) pre[y] = x;
 80     else pre[x] = y;
 81 }
 82
 83 int main() {
 84     // FRead();
 85     cnt = 1;id.cl(); wt.cl(); Cls(vis);
 86     Rint(n);
 87     Rep(i, n*10) {
 88         pre[i] = i;
 89         while(!belong[i].empty()) belong[i].pop();
 90     }
 91     Rep(i, n) {
 92         cin >> user;
 93         cin >> m;
 94         id[user] = cnt++;
 95         Rep(j, m) {
 96             cin >> mail;
 97             if(id.find(mail) == id.end()) id[mail] = cnt++;
 98             wt[mail].insert(user);
 99             unite(id[user], id[mail]);
100         }
101     }
102     map<string, set<string> >::iterator it;
103     set<string>::iterator each;
104     for(it = wt.begin(); it != wt.end(); it++) {
105         for(each = it->second.begin(); each != it->second.end(); each++) {
106             if(!vis[id[*each]]) {
107                 vis[id[*each]] = 1;
108                 belong[find(id[*each])].push(Node(*each, id[*each]));
109             }
110         }
111     }
112     Rep(i, cnt) {
113         if(!belong[i].empty()) {
114             while(!belong[i].empty()) {
115                 cout << belong[i].top().d << " ";
116                 belong[i].pop();
117             }
118             cout << endl;
119         }
120     }
121     RT 0;
122 }

B

C Matrix Sum

解法:这题毒瘤题…数据里有负数,不同语言对负数取模运算的结果不一样,C++和Java是一个负数对一个正数取模是一个负数,而Python是正数。这题的正解应当是二维线段树or树状数组(树套树),分别维护自己列的值。而我直接维护前缀和了。写了各种语言的解法,改来改去最后改了java。

 1 import java.lang.reflect.Array;
 2 import java.util.Arrays;
 3 import java.util.Comparator;
 4 import java.util.Scanner;
 5
 6 import javax.swing.text.GapContent;
 7
 8 public class Main {
 9     public static void main(String[] args) {
10         Scanner in = new Scanner(System.in);
11         int n, m;
12         int[][] dp = new int[1010][1010];
13         String cmd = new String();
14         for(int i = 0; i < 1010; i++) {
15             for(int j = 0; j < 1010; j++) {
16                 dp[i][j] = 0;
17             }
18         }
19         n = in.nextInt(); m = in.nextInt();
20         int x1, x2, y1, y2, num;
21         while(m-- > 0) {
22             cmd = in.next();
23             if(cmd.charAt(0) == ‘A‘) {
24                 x1 = in.nextInt();
25                 y1 = in.nextInt();
26                 num = in.nextInt();
27                 for(int i = y1; i < n; i++) {
28                     dp[x1][i] = (dp[x1][i] + num) % 1000000007;
29                 }
30             }
31             else {
32                 x1 = in.nextInt();
33                 x2 = in.nextInt();
34                 y1 = in.nextInt();
35                 y2 = in.nextInt();
36                 int ret = 0;
37                 for(int i = x1; i <= y1; i++) {
38                     if(x2 == 0) ret = (ret + dp[i][y2]) % 1000000007;
39                     else ret = (ret + dp[i][y2] - dp[i][x2-1]) % 1000000007;
40                 }
41                 System.out.println((ret + 1000000007) % 1000000007);
42             }
43         }
44     }
45 }

C

时间: 2024-10-11 10:54:31

[HIHO]hihoCoder太阁最新面经算法竞赛7的相关文章

Hihocoder 太阁最新面经算法竞赛18

Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus 描述 Given an NxN 01 matrix, find the biggest plus (+) consisting of 1s in the matrix. size 1 plus size 2 plus size 3 plus size 4 plus 1 1 1 1 111 1 1

hihoCoder太阁最新面经算法竞赛19

比赛链接:http://hihocoder.com/contest/hihointerview28/problems A. 固定一个方向,两两相邻的点顺时针或逆时针构造三个向量,判断这个点在这个向量的左侧还是右侧,看看是否在同一侧.trick就是点在向量上,对应的情况就是值为0. 1 def do(p1x, p1y, p2x, p2y, p3x, p3y): 2 return (p3x - p1x) * (p2y - p1y) - (p2x - p1x) * (p3y - p1y); 3 4 T

hihoCoder太阁最新面经算法竞赛18

比赛链接:http://hihocoder.com/contest/hihointerview27/problems A.Big Plus 模拟水 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn = 505; 5 int n; 6 char G[maxn][maxn]; 7 8 bool ok(int x, int y) { 9 return x >= 0 && x < n &

hihoCoder太阁最新面经算法竞赛15

Link: http://hihocoder.com/contest/hihointerview24 题目1 : Boarding Passes 时间限制:10000ms 单点时限:1000ms 内存限制:256MB   描述 Long long ago you took a crazy trip around the world. You can not remember which cities did you start and finish the trip.  Luckily you

hihoCoder太阁最新面经算法竞赛2

A  任务分配 描述 给定 N 项任务的起至时间( S1, E1 ), ( S2, E2 ), ..., ( SN, EN ), 计算最少需要多少台机器才能按时完成所有任务. 同一时间一台机器上最多进行一项任务,并且一项任务必须从头到尾保持在一台机器上进行.任务切换不需要时间. 输入 第一行一个整数 N,(1 ≤ N ≤ 100000),表示任务的数目. 以下 N 行每行两个整数 Si, Ei,(0 ≤ Si < Ei ≤ 1000000000),表示任务的起至时间. 输出 输出一个整数,表示最

zz 圣诞丨太阁所有的免费算法视频资料整理

首发于 太阁实验室 关注专栏 写文章 圣诞丨太阁所有的免费算法视频资料整理 Ray Cao· 12 小时前 感谢大家一年以来对太阁实验室的支持,我们特地整理了在过去一年中我们所有的原创算法类视频,均为免费观看,方便大家学习. 先放一个ACM大神讲解的算法题视频(国外传优酷真的是太不容易了……). ACM大神精讲北美最新面试题—在线播放—优酷网,视频高清在线观看http://v.youku.com/v_show/id_XMTg2ODk0MzIwMA==.html 其余视频: [公开课]ACM大神精

算法竞赛专题解析(1):二分法、三分法

目录 1. 二分法的理论背景 2. 整数二分模板 2.1 基本形式 2.2 STL的lower_bound()和upper_bound() 2.3 简单例题 3. 整数二分典型题目 3.1 最大值最小化(最大值尽量小 3.1.1序列划分问题 3.1.2 通往奥格瑞玛的道路 3.2 最小值最大化(最小值尽量大) 4. 实数二分 4.1 基本形式 4.2 实数二分例题 5. 二分法习题 6. 三分法求极值 6.1 原理 6.2 实数三分 6.2.1 实数三分习题 6.3 整数三分 本系列是这本算法教

[算法竞赛入门]第二章_循环结构程序设计

第2章 循环结构程序设计 [学习内容相关章节] 2.1for循环 2.2循环结构程序设计 2.3文件操作 2.4小结与习题 [学习目标] (1)掌握for循环的使用方法: (2)掌握while循环的使用方法: (3)学会使用计算器和累加器: (4)学会用输出中间结果的方法调试: (5)学会用计时函数测试程序效率: (6)学会用重定向的方式读写文件: (7)学会fopen的方式读写文件: (8)了解算法竞赛对文件读写方式和命名的严格性: (9)记住变量在赋值之前的值是不确定的: (10)学会使用条

深度学习攻防对抗(JCAI-19 阿里巴巴人工智能对抗算法竞赛)

最近在参加IJCAI-19阿里巴巴人工智能对抗算法竞赛(点击了解),初赛刚刚结束,防御第23名,目标攻击和无目标攻击出了点小问题,成绩不太好都是50多名,由于找不到队友,只好一个人跟一群大佬PK,双拳难敌四手,差点自闭放弃比赛了.由于知道对抗攻击的人很少,于是抽空写篇博客,简单科普一下人工智能与信息安全的交叉前沿研究领域:深度学习攻防对抗. 然后简单介绍一下IJCAI-19 阿里巴巴人工智能对抗算法竞赛 目前,人脸识别.自动驾驶.刷脸支付.抓捕逃犯.美颜直播……人工智能与实体经济深度结合,彻底改