T1 题意:给你一个串,求所有子序列个数,满足没有相同字符。1e5,2s。

解:考虑一个合法的子序列。其中每个字母的出现位置都有(出现次数)种选择。还可以不选,要 + 1。

然后乘起来就做完了。如果变成子串的话更简单,每个位置为开头的长度不会超过26,直接暴力。本质不同子串就开个hash池判重。

本质不同子序列......不会。

 #include <bits/stdc++.h>

 const int N = , MO = 1e9 + ;

 char str[N];
int bin[]; int main() {
int n;
scanf("%d", &n);
scanf("%s", str);
for(int i = ; i < n; i++) {
bin[str[i] - 'a']++;
}
int ans = ;
for(int i = ; i < ; i++) {
ans = 1ll * ans * (bin[i] + ) % MO;
}
printf("%d", (ans + MO - ) % MO); return ;
}

AC代码

T2 题意:给你一个序列,可以若干次选择两个相同的数字,使其之间的数字全部变成这个数字。求最终可能的序列总数。2e5,2s。

解:发现选出来的序列一定是一些相离的,所以可以DP,设f[i]表示前i位可能的方案总数。那么第i位可能和前面任一个相同的数匹配,f[i] += f[j - 1]。

同时也可能不匹配,相当于自己跟自己匹配。我们要对所有ai等于一个数的DP值求和,直接开个桶。

发现有连续相同的数的时候会挂,把它们缩起来。

 #include <bits/stdc++.h>

 typedef long long LL;
const int N = , MO = 1e9 + ; int a[N], bin[N], f[N]; int main() { int n;
scanf("%d", &n);
for(int i = ; i <= n; i++) {
scanf("%d", &a[i]);
if(a[i] == a[i - ]) {
i--;
n--;
}
}
f[] = ;
for(int i = ; i <= n; i++) {
(bin[a[i]] += f[i - ]) %= MO;
f[i] = bin[a[i]];
}
printf("%d", f[n]); return ;
}

AC代码

T3 题意:求一个1 ~ 2n的排列,满足第一个数是A,最后一个数是B,且相邻两个数的二进制只有一位不同。17,2s。

解:猜一下结论,如果A和B二进制下不同的位数有偶数个,那么一定无解。其余的有解。

因为有个头尾的限制,所以我们直接暴力分治。

每次讨论A和B最高位是否相同。相同的话就先把最高位变一下填2n-1个,然后变回来填后面的。

不同的话就前2n-1个最高位从A,后面最高位从B。

 /**
* There is a start and there is no end in the space. ---Infinity.
* It ruins and goes though there is also a start in stars. ---Finite.
* Only the man who has wisdom can read the most foolish one from the history.
* Fishes living in the sea doesn't know the life in the land.
* It also ruins and goes if they have wisdom.
* It funnier that man exceeds the speed of light than fish start living in the land.
* It can be said that this is an final ultimatum from the god to the people who can fight.
*
* Steins;Gate
*/ #include <bits/stdc++.h> const int N = ; int n, A, B, p[N], top, now, lm, same, dt; inline void out(int x) {
for(int i = ; i < n; i++) {
printf("%d", (x >> i) & );
}
return;
} inline int cal(int x) {
int ans = ;
while(x) {
ans++;
x -= x & (-x);
}
return ans;
} inline int Abs(int x) {
return x < ? -x : x;
} inline int First(int x) {
for(int i = n - ; i >= ; i--) {
if((x >> i) & ) return << i;
}
return ;
} void solve(int n, int l, int r, int a, int b) {
if(n == ) {
p[l] = a;
p[r] = b;
return;
}
int mid = (l + r) >> , nexlm = ( << (n - )) - ;
if(((a >> (n - )) & ) == ((b >> (n - )) & )) {
solve(n - , mid + , r, a & nexlm, b & nexlm);
if((a >> (n - )) & ) {
for(int i = mid + ; i <= r; i++) {
p[i] |= << (n - );
}
p[l] = p[mid + ];
solve(n - , l + , mid + , a & nexlm, p[mid + ] & nexlm);
}
else {
p[l] = p[mid + ];
solve(n - , l + , mid + , a & nexlm, p[mid + ] & nexlm);
for(int i = l + ; i <= mid + ; i++) {
p[i] |= ( << (n - ));
}
}
}
else {
solve(n - , l, mid, a & nexlm, (b & nexlm) ^ );
if((a >> (n - )) & ) {
for(int i = l; i <= mid; i++) {
p[i] |= << (n - );
}
solve(n - , mid + , r, p[mid] & nexlm, b & nexlm);
}
else {
solve(n - , mid + , r, p[mid] & nexlm, b & nexlm);
for(int i = mid + ; i <= r; i++) {
p[i] |= << (n - );
}
}
}
return;
} int main() { scanf("%d%d%d", &n, &A, &B);
lm = ( << n) - , dt = A ^ B, same = dt ^ lm; if((cal(dt) & ) == ) {
puts("NO");
}
else {
puts("YES");
solve(n, , lm, A, B);
for(int i = ; i <= lm; i++) {
//out(p[i]); printf(" ");
printf("%d ", p[i]);
//puts("");
}
}
return ;
}

AC代码

T4 题意:给定两个排列a和b,定义f(a, b)是一个排列,满足第ai个位置上的数是bi。定义A为一个序列,每个元素是一个排列,且A1 = a, A2 = b, Ai = f(Ai-2, Ai-1),求Ak。10w,1e9,2s。

解:神仙...

对于两个排列a和b,定义ab[i] = a[b[i]], a-1[a[i]] = i。于是我们把A的前几项写出来,然后瞎搞一通,就能发现一个奇妙的规律orz...

直接上官方题解了。

我们把A的每一个元素拆成sts-1的形式。然后发现si+6 = siba-1b-1a,是个等比数列。然后t是6个一循环的。

于是我们求出ba-1b-1a的k / 6次方就做完了......注意到求一个排列的k次方只需找出每个元素所在的环,然后跳(k % 环长)步即可。

 #include <bits/stdc++.h>

 const int N = ;

 int a[N], b[N], c[N], d[N], A[N], n, k, vis[N], B[N], dis[N], C[N], D[N];
int t1[][N], t2[][N], t3[][N], ans[][N];
std::vector<int> v[N]; inline int Find(int x, int t) {
int loop = v[vis[x]].size() - ;
t = (t + dis[x]) % loop;
return v[vis[x]][t];
} int main() { scanf("%d%d", &n, &k);
k--;
for(int i = ; i <= n; i++) scanf("%d", &a[i]);
for(int i = ; i <= n; i++) scanf("%d", &b[i]); /// get A c = b-1 d = a-1
for(int i = ; i <= n; i++) {
c[b[i]] = i;
d[a[i]] = i;
}
/*for(int i = 1; i <= n; i++) {
printf("%d ", c[i]);
}
puts("");
for(int i = 1; i <= n; i++) {
printf("%d ", d[i]);
}
puts("");*/
for(int i = ; i <= n; i++) {
A[i] = b[d[c[ a[i] ]]];
}
int t = k / ;
//printf("t = %d \n", t);
/// get B = A^t
for(int i = ; i <= n; i++) {
if(vis[i]) continue;
/// !vis[i]
int j = i;
v[i].push_back(i);
do {
j = A[j];
dis[j] = v[i].size();
vis[j] = i;
v[i].push_back(j);
} while(j != i);
dis[i] = ;
}
for(int i = ; i <= n; i++) {
B[i] = t ? Find(i, t) : i;
} /*printf("vis : \n");
for(int i = 1; i <= n; i++) {
printf("%d ", vis[i]);
}
puts(""); printf("A : \n");
for(int i = 1; i <= n; i++) {
printf("%d ", A[i]);
}
puts("");*/ memcpy(t1[] + , B + , n * sizeof(int));
memcpy(t1[] + , B + , n * sizeof(int));
memcpy(t2[] + , a + , n * sizeof(int));
memcpy(t2[] + , b + , n * sizeof(int));
for(int i = ; i <= n; i++) {
t3[][t1[][i]] = i;
t3[][t1[][i]] = i;
} for(int i = ; i <= n; i++) {
ans[][i] = t1[][t2[][t3[][i]]];
ans[][i] = t1[][t2[][t3[][i]]];
}
t = k % ;
//printf("t = %d \n", t);
for(int i = ; i <= t; i++) {
for(int j = ; j <= n; j++) {
ans[i][ans[i - ][j]] = ans[i - ][j];
}
} /*puts("");
for(int i = 0; i <= 1; i++) {
for(int j = 1; j <= n; j++) {
printf("%d ", ans[i][j]);
}
puts("");
}
puts("");*/ for(int i = ; i <= n; i++) {
printf("%d ", ans[t][i]);
} return ;
}

AC代码

agc031的更多相关文章

  1. AtCoder Grand Contest 031 (AGC031) D - A Sequence of Permutations 其他

    原文链接https://www.cnblogs.com/zhouzhendong/p/AGC031D.html 前言 比赛的时候看到这题之后在草稿纸上写下的第一个式子就是 $$f(p,q) = pq^ ...

  2. 【AtCoder】AGC031

    A - Colorful Subsequence 答案是 \(\prod_{c = 'a'}^{'z'} (cnt[c] + 1)\) #include <bits/stdc++.h> # ...

  3. AGC031 A~C

    A题意:给定字符串s,求无重复字符子序列个数(子序列相同位置不同算不同) 在最后加一串a~z表示选了这些就是不选这个字符了,然后答案就是每次选每个字符位置的方案数的积 #include<iost ...

  4. AtCoder Grand Contest 031 B - Reversi

    https://atcoder.jp/contests/agc031/tasks/agc031_b B - Reversi Time Limit: 2 sec / Memory Limit: 1024 ...

  5. AtCoder Grand Contest 031 B - Reversi(DP)

    B - Reversi 题目链接:https://atcoder.jp/contests/agc031/tasks/agc031_b 题意: 给出n个数,然后现在你可以对一段区间修改成相同的值,前提是 ...

  6. Atcoder AGC031C Differ By 1 Bit (构造、二进制)

    哎呀这个C怎么比B还水....(我现在大概也就会做点这种水题了吧) 题目链接 https://atcoder.jp/contests/agc031/tasks/agc031_c 题目大意 符号约定: ...

  7. Atcoder AGC031B Reversi (DP计数)

    简单的计数题.(总算做出一道AGC的B题了,然而这场比赛我忘记打了233333) 题目链接: https://atcoder.jp/contests/agc031/tasks/agc031_b 题意: ...

  8. AtCoder整理(持续更新中……)

    做了那么久的atcoder觉得自己的题解发的很乱 给有想和我一起交流atcoder题目(或者指出我做法的很菜)(或者指责我为什么整场比赛只会抄题解)的同学一个索引的机会??? 于是写了个爬虫爬了下 A ...

  9. 【做题记录】AtCoder AGC做题记录

    做一下AtCoder的AGC锻炼一下思维吧 目前已做题数: 75 总共题数: 239 每一场比赛后面的字母是做完的题,括号里是写完题解的题 AGC001: ABCDEF (DEF) AGC002: A ...

随机推荐

  1. Docker实现运行tomcat并部署项目war包,并实现挂载目录

    之前写的有点乱,现在再来整理一下docker的简单部署运行 借鉴博客:https://blog.csdn.net/qq_32351227/article/details/78673591 一.dock ...

  2. NOIP2016提高组复赛C 愤怒的小鸟

    题目链接:http://uoj.ac/problem/265 题目大意: 太长了不想概括... 分析: 状压DP的模板题,把所有可能的抛物线用二进制表示,然后暴力枚举所有组合,详情见代码内注释 代码如 ...

  3. CDH 6.0.1 集群搭建 「Before install」

    从这一篇文章开始会有三篇文章依次介绍集群搭建 「Before install」 「Process」 「After install」 继上一篇使用 docker 部署单机 CDH 的文章,当我们使用 d ...

  4. MySQL执行语句的顺序

    MySQL的语句一共分为11步,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对用户来说是透明的,但是只有 ...

  5. 莫烦sklearn学习自修第七天【交叉验证】

    1. 什么是交叉验证 所谓交叉验证指的是将样本分为两组,一组为训练样本,一组为测试样本:对于哪些数据分为训练样本,哪些数据分为测试样本,进行多次拆分,每次将整个样本进行不同的拆分,对这些不同的拆分每个 ...

  6. git放弃修改,强制覆盖本地代码

    $ git fetch --all $ git reset --hard origin/master $ git pull

  7. linux 地址解析协议 arp

    随便转载,保留出处:http://www.cnblogs.com/aaron-agu/ arp –na #查看 arp –s 123.253.68.209 00:19:56:6F:87:D4 #添加

  8. Xamarin 简化的Android密钥库签名

    安装 开始使用这个新工具不容易.在Visual Studio 2017(即将推出VS 2015),只需转到工具 - >扩展和更新,并搜索“密钥库”来查找扩展名. 下载后,只需重新启动Visual ...

  9. React 学习(五) ---- 条件和列表渲染

    条件渲染 React中的条件渲染和我们平常写的js 代码一样,都是用的if else, 只不过在if else 中它的返回值是jsx, 根据不同的条件渲染不同的UI. 先写两个组件 //登录的用户显示 ...

  10. 一条命令停止所有lxc容器,删除所有lxc容器

    for i in $(virsh -c lxc:/// list | grep -v 'Id' | awk '{print $2}');do virsh -c lxc:/// destroy ${i} ...