CODE FESTIVAL 2017 qual C 题解
\(A\)
咕咕
const int N=15;
char s[N];int n;
int main(){
scanf("%s",s+1),n=strlen(s+1);
fp(i,1,n-1)if(s[i]=='A'&&s[i+1]=='C')return puts("Yes"),0;
puts("No");
return 0;
}
\(B\)
咕咕
const int N=15;
int a[N],n,res,ret;
int main(){
scanf("%d",&n),res=ret=1;
fp(i,1,n)scanf("%d",&a[i]),res*=3,ret*=(a[i]&1?1:2);
printf("%d\n",res-ret);
return 0;
}
\(C\)
首先去掉所有\(x\)之后得是一个回文,然后把不是\(x\)字母之间的\(x\)填到对称就是了
//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=1e5+5;
char s[N];int st[N],n,res,top;
int main(){
scanf("%s",s+1),n=strlen(s+1);
fp(i,1,n)if(s[i]!='x')st[++top]=i;
for(R int i=1,j=top;i<j;++i,--j)
if(s[st[i]]!=s[st[j]])return puts("-1"),0;
st[top+1]=n+1;
for(R int i=0,j=top+1;i<j-1;++i,--j)
res+=abs((st[i+1]-st[i]-1)-(st[j]-st[j-1]-1));
printf("%d\n",res);
return 0;
}
\(D\)
把前缀每个字母的奇偶性压位,记\(f_i\)表示取完前\(i\)个字母的最小步数,那么一个状态\(s\)只可能从之前某一个最多相差一个\(1\)的位置转移过来,那么记录一下每个\(s\)对应的最小步数的位置即可
//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=2e5+5,L=(1<<26)+5;
char s[N];int a[N],f[N],pos[L],n;
int main(){
scanf("%s",s+1),n=strlen(s+1);
fp(i,1,n)a[i]=a[i-1]^(1<<(s[i]-'a'));
memset(pos,-1,sizeof(pos));
pos[0]=0;
fp(i,1,n){
f[i]=233333;
fp(j,0,25)if(pos[a[i]^(1<<j)]!=-1)cmin(f[i],f[pos[a[i]^(1<<j)]]+1);
if(pos[a[i]]!=-1)cmin(f[i],f[pos[a[i]]]+1);
if(pos[a[i]]==-1||f[i]<f[pos[a[i]]])pos[a[i]]=i;
}
printf("%d\n",f[n]);
return 0;
}
\(E\)
看不懂……咕了……
\(F\)
首先我们发现,如果已经确定了三个人吃的寿司的序列,那么合法的\(c\)的个数只与\(n\)有关,与它们具体吃的是什么无关,那么可以求出\(C\)吃的序列个数最后乘上这个系数
考虑\(dp\),\(C\)吃的什么先不确定,记为\(?\),\(f[i][j][k]\)表示\(A\)吃到第\(i\)个位置,\(B\)吃到第\(j\)个位置,\(C\)有\(k\)个\(?\)的方案数,具体过程看代码
然后再算出\(g[i][j]\)表示前\(i\)个位置放了\(j\)个不是\(C\)吃的数的方案数
//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int P=1e9+7;
inline void upd(R int &x,R int y){(x+=y)>=P?x-=P:0;}
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
R int res=1;
for(;y;y>>=1,x=mul(x,x))(y&1)?res=mul(res,x):0;
return res;
}
const int N=405;
int f[N][N][N],g[N][N],a[N],b[N],as[N],bs[N];
int n,m;
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d",&n),m=n/3;
fp(i,1,n)scanf("%d",&a[i]),as[a[i]]=i;
fp(i,1,n)scanf("%d",&b[i]),bs[b[i]]=i;
f[1][1][0]=1;
fp(i,1,n)fp(j,1,n)fp(k,0,m)if(f[i][j][k]){
R int ret=f[i][j][k];
if(bs[a[i]]<=j||as[b[j]]<=i){
if(a[i]==b[j]){
if(k)upd(f[i+1][j+1][k-1],mul(ret,k));
continue;
}
upd((bs[a[i]]<=j?f[i+1][j][k]:f[i][j+1][k]),ret);
continue;
}
upd(f[i+1][j+1][k+1],ret);
if(k){
upd(f[i+1][j][k-1],mul(ret,k));
upd(f[i][j+1][k-1],mul(ret,k));
if(k>1)upd(f[i+1][j+1][k-2],P-mul(ret,k*(k-1)));
}
}
R int res=0;
fp(i,m+1,n+1)upd(res,add(f[i][n+1][0],f[n+1][i][0]));
upd(res,P-f[n+1][n+1][0]);
g[0][0]=1;
fp(i,0,n-1)fp(j,0,i)if(g[i][j]){
if(i-j<m)upd(g[i+1][j],g[i][j]);
if(j<m*2&&(i-j)*2>j)upd(g[i+1][j+1],mul(g[i][j],(i-j)*2-j));
}
res=mul(res,g[n][m<<1]);
printf("%d\n",res);
return 0;
}
CODE FESTIVAL 2017 qual C 题解的更多相关文章
- CODE FESTIVAL 2017 qual A 题解
补一发A的题解. A - Snuke's favorite YAKINIKU 题意: 输入字符串S,如果以YAKI开头输出Yes,否则输出No. #include<bits/stdc++.h&g ...
- CODE FESTIVAL 2017 qual B 题解
失踪人口回归.撒花\^o^/ 说来真是惭愧,NOI之后就没怎么刷过题,就写了几道集训队作业题,打了几场比赛还烂的不行,atcoder至今是蓝名=.= 以后还是多更一些博客吧,我可不想清华集训的时候就退 ...
- CODE FESTIVAL 2017 qual B C - 3 Steps【二分图】
CODE FESTIVAL 2017 qual B C - 3 Steps 题意:给定一个n个结点m条边的无向图,若两点间走三步可以到,那么两点间可以直接连一条边,已经有边的不能连,问一共最多能连多少 ...
- CODE FESTIVAL 2017 qual B B - Problem Set【水题,stl map】
CODE FESTIVAL 2017 qual B B - Problem Set 确实水题,但当时没想到map,用sort后逐个比较解决的,感觉麻烦些,虽然效率高很多.map确实好写点. 用map: ...
- 题解【AtCoder - CODE FESTIVAL 2017 qual B - D - 101 to 010】
题目:https://atcoder.jp/contests/code-festival-2017-qualb/tasks/code_festival_2017_qualb_d 题意:给一个 01 串 ...
- 【题解】Popping Balls AtCoder Code Festival 2017 qual B E 组合计数
蒟蒻__stdcall终于更新博客辣~ 一下午+一晚上=一道计数题QAQ 为什么计数题都这么玄学啊QAQ Prelude 题目链接:这里是传送门= ̄ω ̄= 下面我将分几个步骤讲一下这个题的做法,大家不 ...
- Atcoder Code Festival 2017 qual C 10.22 D题题解
[题意概述] 给出一个只有小写字母的序列,问最少把序列分成几段可以满足每一段可以通过变换成为回文串.变换指的是交换子序列中的字母的位置. [题解] 我们把a~z分别设为2^0~2^25,每个子序列满足 ...
- Atcoder CODE FESTIVAL 2017 qual C D - Yet Another Palindrome Partitioning 回文串划分
题目链接 题意 给定一个字符串(长度\(\leq 2e5\)),将其划分成尽量少的段,使得每段内重新排列后可以成为一个回文串. 题解 分析 每段内重新排列后是一个回文串\(\rightarrow\)该 ...
- CODE FESTIVAL 2017 qual B
昨晚因为有点事就去忙了,没打后悔啊 A - XXFESTIVAL Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem ...
随机推荐
- 在 WPF 中获取一个依赖对象的所有依赖项属性
原文:在 WPF 中获取一个依赖对象的所有依赖项属性 本文介绍如何在 WPF 中获取一个依赖对象的所有依赖项属性. 本文内容 通过 WPF 标记获取 通过设计器专用方法获取 通过 WPF 标记获取 p ...
- nlp-roadmap
nlp-roadmap https://github.com/graykode/nlp-roadmap nlp-roadmap is Natural Language Processing ROADM ...
- iOS - 静态库的导入和头文件路径的设置
开发过程中,免不了要用到一些第三方或者是别人写好的一些Demo,这时就经常会用到别人写的一些静态库(.a文件)和n多个头文件(.h文件),这些文件不是简单地把它们拉到自己的工程里面就行的,还要设置一些 ...
- FreeRTOS队列操作
API函数 //创建 #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) #define xQueueCreate( uxQueueLength, uxItemS ...
- 笔谈FFmpeg(一)
现在的工作是播放器库的开发,可不是调用iOS系统自带的播放器框架进行一些简单的功能和界面定制,这些没什么含量.涉及iOS开发有3个年头了,现在的工作算是有点含金量了.涉及播放器的开发,FFmpeg的架 ...
- eslint校验——开启服务后自动校验
"[javascriptreact]": { "editor.defaultFormatter": "esbenp.prettier-vscode&q ...
- 【JUC】5.线程池—Executor
创建线程池可以分为三种方式: 1. 通过ThreadPoolExecutor的构造方法,创建ThreadPoolExecutor的对象,即一个线程池对象: 此构造方法,一共7个参数,5个必须参数,2个 ...
- Find 命令记录
当需要查找一个时间的文件时 使用find [文件目录] -mtime [时间] 例如:查看mysql.bak目录下的1天前的文件 find mysql.bak -mtime 找到此文件之后需要将它移动 ...
- 12.安装olny office服务---不成功
安装olny office服务 在01.centos7环境准备的基础上安装olny office服务 参考博客:https://blog.csdn.net/networken/article/deta ...
- 运维开发笔记整理-django日志配置
运维开发笔记整理-django日志配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Django日志 Django使用python内建的logging模块打印日志,Pytho ...