恭喜发现宝藏!搜索公众号【TechGuide】回复公司名,解锁更多新鲜好文和互联网大厂的笔经面经,目前已更新至美团、微软…
作者@TechGuide【全网同名】
点赞再看,养成习惯,您动动手指对原创作者意义非凡
一个字母可以拆分成两个字母表顺序的前一个字母,例如,b可以拆分成aa,c可以拆分成bb。
打印出最短的可以拆分成 K 个 a 的字符串,字母顺序无所谓。
例如,k = 5, 最短字符串为 ca(或ac) = bba = aaaaa.
K = 1, a; K = 2, b; K = 4, c;…
public static void main1(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
StringBuilder sb = new StringBuilder();
int i = 0;
while(n > 0){
if((n&1) == 1){
sb.append((char)('a'+i));
}
i++;
n = n >> 1;
}
System.out.println(sb.toString());
}
// vx公众号关注TechGuide 实时题库 闪电速递
N个节点的树,根节点编号为1。
最开始,树上所有节点的值都为1。
你可以进行如下操作,选择一个子树,让子树的所有节点的值+1.
问,最少需要多少次操作才可以让每个节点的值等于其编号。
隐藏case,若进行上述操作无法使得节点值等于编号,则打印-1.
输入描述
3 // 3个节点
1 3 // 1-3相连
1 2 // 1-2相连
输出描述
3
// 2 节点子树,操作一次
// 3 节点子树,操作二次
建图跑一个dfs就好,对于每个点,如果其子节点的标记值大于它,则把差值累加到答案上,输出即可。
(这里有个坑点,当出现任意一个父节点的标记值小于其子节点的标记值时,很明显是无法实现题目的情况的,也就是没有答案,这里应该输出-1,但是出题人没写,应该是题面漏放了)
static List<List<Integer>> list;
static boolean vis[];
static long ret;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
vis = new boolean[n+1];
ret = 0;
list = new ArrayList<>();
for(int i = 0; i <= n; i++){
list.add(new ArrayList<>());
}
for(int i = 1; i < n; i++){
int a = sc.nextInt();
int b = sc.nextInt();
list.get(a).add(b);
list.get(b).add(a);
}
dfs(1, 1);
System.out.println(ret);
}
public static void dfs(int node, int del) {
if(node < del || ret == -1) {
ret = -1;
return;
}
ret += node - del;
vis[node] = true;
for(int child : list.get(node)){
if(!vis[child]){
dfs(child, node);
}
}
}
// vx公众号关注TechGuide 实时题库 闪电速递
#include
#include
#include
#include
using namespace std;
typedef unsigned long long ull;
int main(){
ull n,a,b;cin>>n;
ull sumo=0;
vector<vector<ull>> e(n);
for(int i=1;i<n;i++){
cin>>a>>b;
a--,b--;
e[a].push_back(b);
e[b].push_back(a);
}
function<void(ull,ull)> f = [&](ull i, ull fa){
sumo+=i-fa;
for(auto j:e[i])
if(j!=fa)
f(j,i);
};
for(auto i:e[0])
f(i,0);
cout<<sumo;
return 0;
}
// vx公众号关注TechGuide 实时题库 闪电速递
小红定义一个字符串是好串,当且仅当一个字符出现次数为奇数 其他为偶数。
小红拿到了一个字符串,她想知道该字符串有多少子序列是好串?
子序列的定义:字符串中按原串顺序取一些字母组成的字符串(在原串中可以不连续)。
例如,“arcaea"的子序列有"aaa”、"ace"等等。
题目有歧义欢迎在评论区补充
输入描述
一个长度不超过2e5的、仅由小写字母组成的字符串。
输出描述
好子序列的数量。
由于答案可能会很大,请对1e9+7取模后再输出。
由于我们只需要关心字母出现的奇偶性,那么我们可以对任意一个字符串,都用一个26位的数字来表示其26个字母的奇偶性状态。
我们先对整个字符串做个前缀和,那就得到了200001个状态,使用map记录每个状态出现了多少次,然后用auto for去遍历map里的每个状
态,再for一遍26位字母,改变其奇偶性,也就是说把
M[now]*M[now^(1<
代码
Java版本
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll ans = 0;
map<int,int>M;
char s[200007];
int main(){
scanf("%s",s);
int len = strlen(s);
int now = 0;//初始状态为0,每个字母都出现了0(偶数)次
M[0] = 1;
for(int i = 0; i < len; i++){
int temp = s[i] - 'a';
now ^= (1 << temp);
if(M.find(now) == M.end()) M[now] = 1;
else M[now]++;
}
for(auto x:M){
int now = x.first;
for(int i = 0; i < 26; i++){
ans += M[now] * (ll)M[now ^ (1 << i)];
}
}
printf("%lld\n",ans/2);
}
// vx公众号关注TechGuide 实时题库 闪电速递
CPP版本
#include