第一题
思路
花里胡哨,一度误导我站在树结构上思考。
本质并查集,查找最多人数的小组。
AC代码
import java.util.*;
public class Main {
static class UF {
private int[] id;
private int[] sz; // weight for node
private int count;
public UF(int N) {
count = N;
id = new int[N];
for (int i = 0; i < N; i++) {
id[i] = i;
}
sz = new int[N];
for (int i = 0; i < N; i++) {
sz[i] = 1;
}
}
public int find(int x) {
int p = x, t;
while (p != id[p])
p = id[p];
// path yasuo
while (x != p) {
t = id[x];
id[x] = p;
x = t;
}
return x;
}
public boolean connected(int p, int q) {
return find(p) == find(q);
}
public void union(int p, int q) {
int pRoot = find(p);
int qRoot = find(q);
if (pRoot == qRoot)
return;
// add the little tree to big tree
if (sz[pRoot] < sz[qRoot]) {
id[pRoot] = qRoot;
sz[qRoot] += sz[pRoot]; //
} else {
id[qRoot] = pRoot;
sz[pRoot] += sz[qRoot];
}
count--;
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
UF uf = new UF(n);
for (int i=0;i<n-1;i++){
int p = scanner.nextInt()-1;
int q = scanner.nextInt()-1;
if (q == 0)
continue;
if (uf.connected(p, q))
continue;
uf.union(p, q);
}
int res = 0;
for (int i=0;i<n;i++){
if (uf.sz[i] > res)
res = uf.sz[i];
}
System.out.println(res);
}
}
第二题
没图。。。
- IN:
用于匹配的短字符串数量:3
用于匹配的短字符串:
b
aa
ac
被匹配长字符串:
bbaac
- OUT:
不重复的匹配字符串组数:3
- 要求:
最多有多少组不重复的匹配字符串。(比如例题:b,b,aa,ac一共有四组,但是aa和ac重复了,去除一组,输出3)
思路
KMP字符串匹配记录count;同时每组记录startpos和endpos;然后贪心算构造无重叠区域最少需要删去的记录组数。count减去上面这个为输出。跟第一题一样,本质KMP+贪心求无重叠区域,套了一件花里胡哨的外壳。