考场

T1 一下想到了这题,将白块缩短 \(s\) 后维护类似的区间即可。

T2 T3 俩计数,直接跳了。

T4 的可行 \(t\) 集合相同相当与从 \(n\) 往前跳 kmp 数组,途径点相同,从前往后构造即可。

问题是可能会出现一个区间分裂成好几个(开个队列),\(k\) 很小而 \(a_i\) 很大(每次跳到块尾),然后一直调到 10.20 还过不了拍,先丢了。

写完 T2 T3 俩暴力,发现 T4 \(2\times kmp[i]<i\) 的时候中间不知道填啥,不能全填 \(0/1\),然后一直手玩样例,三个样例总有一个过不去。。。

快结束的时候看了眼 T1,把每次跳到块尾的操作删了就过拍了,想着题面说数据有梯度,就交了个宁愿 T 的

res

rk19 0+0+15+0

T1 T2 全 T 了

T4 就是中间部分错了(注意空间)

rk1 yzf 100+100+40+20

rk2 szs 100+0+100+0

rk5 zjj 90+0+10+0

rk5 mtr 100+0+0+0

rk10 ycx 10+0+10+30

rk18 zkx 0+0+25+0

总结

其实没啥说的,就是菜

这场前面的人基本都 A 了 T1,但我考场上完全没往同余上想,有一个思路就面向数据编程,一直调,这样极容易暴毙,以后只有在确定算法正确性、复杂度的情况且其他题打满暴力的情况下再肝题。

计数也是传统弱项了,但前面没怎么考也就没太注意,靠模拟赛尽量查漏补缺吧。

这次虽然提前开始打暴力,但 T2 全 T 了,暴力也算下复杂度,如果卡的紧就尽量剪剪枝。

sol

T1

每次跳到的位置模 \(k\) 同余,将黑块延长 \(s\) 后模 \(k\),如果 \([0,k)\) 中出现了一个点没被黑块覆盖说明有解。细节比较多。

const int N = 5e5+5;
int T,s,k,n; PII f[N*2]; void solve() {
int cnt = 0; LL now = 0; bool flg = 0;
read(s,k,n); assert(k>s);
For(i,1,n) {
int len; read(len);
if( i & 1 ) {
LL l = now+1, r = now+len+s-1;
if( r-l+1 >= k-1 ) flg = 1;
l %= k, r %= k;
if( l <= r ) f[++cnt] = MP(l,r);
else f[++cnt] = MP(0,r), f[++cnt] = MP(l,k-1);
}
now += len;
}
if( flg ) return puts("NIE"), void();
sort(f+1,f+cnt+1);
For(i,2,cnt) assert(f[i].fi!=f[i-1].fi||f[i].se>=f[i-1].se);
For(i,1,cnt) {
ckmax(f[i].se,f[i-1].se);
if( f[i-1].se+1 < f[i].fi ) return puts("TAK"), void();
}
puts(f[cnt].se+1<k ? "TAK" : "NIE");
} signed main() {
f[0].se = -1;
read(T);
while( T-- ) solve();
return iocl();
}
T2

由于字典序从前往后比,即前面的影响更大,考虑从后往前 DP。设 \(f[i,j,l,r]\) 为第 \(l\) 个字符串到第 \(f\) 个,后缀 \(i\) 填完,当前这位至少是字符 \(j\) 的方案数

const int N = 55, L = 25, mod = 990804011;
int n;
char s[N][L]; int m;
LL f[L][30][N][N]; signed main() {
scanf("%d",&n);
For(i,1,n) {
scanf("%s",s[i]+1);
ckmax(m,(int)strlen(s[i]+1));
}
For(i,1,n) {
For(j,1,m) if( !s[i][j] ) s[i][j] = 'a'-1;
For(j,0,26) f[m+1][j][i][i] = 1;
}
rFor(i,m,1) rFor(j,26,0) rFor(l,n,1) For(r,l,n) {
LL &dp = f[i][j][l][r];
dp += f[i][j+1][l][r];
for(int mid = l; (s[mid][i]=='a'+j-1||s[mid][i]=='?') && mid <= r; ++mid) {
if( s[mid][i] == '?' && !j ) break;
dp += f[i+1][0][l][mid] * (mid==r?1:f[i][j+1][mid+1][r]) %mod;
}
dp %= mod;
}
write(f[1][0][1][n]);
return iocl();
}
T3

把 \(x\) 都减一。\(f\) 的值就是从 \((0,0,\cdots,0)\) 走到 \((x_1,x_2,\cdots,x_k)\) 的方案数的奇偶性,有两种考虑方式:多重集排列数(对应方案数);因子 \(2\) 的个数(数位),可以得到一个结论:\(f\) 值为 \(1\) 时,二进制下每一位最多有一个 \(x_i\) 为 \(1\)。容斥+数位 DP 即可。

const int mod = 990804011;
int T,k;
LL l[9],r[9]; int all;
LL n[9],f[51][1<<10]; template<typename T>void ckadd(T &x,T y)
{ x += y; if(x>=mod) x-=mod; else if(x<0) x+=mod; } LL dfs(int u,int lim) {
if( !u ) return 1;
if( ~f[u][lim] ) return f[u][lim];
int lim1 = 0;
For(i,0,k) if( (lim & (1<<i)) && !(n[i] & (1ll<<u-1)) ) lim1 |= 1<<i;
LL res = dfs(u-1,lim1);
For(i,0,k) if( !(lim & (1<<i)) || (n[i] & (1ll<<u-1)) )
ckadd(res,dfs(u-1,lim&(1<<i) ? lim1|(1<<i) : lim1));
return f[u][lim] = res;
}
void solve() {
LL ans = 0;
read(k); all = (1<<k--)-1;
For(i,0,k) read(l[i],r[i]), --l[i], --r[i];
for(int s = all; ~s; --s) {
int cnt = 0; memset(f,0xff,sizeof f);
For(i,0,k)
if( s & (1<<i) ) n[i] = r[i];
else ++cnt, n[i] = l[i]-1;
if( *min_element(n,n+k+1) >= 0 ) ckadd(ans,(cnt&1?-1:1) * dfs(50,all));
}
write(ans);
} signed main() {
read(T);
while( T-- ) solve();
return iocl();
}
T4

考虑贪心,那么中间部分一定全填 \(0\),否则最后一位填 \(1\) 即可,能否全填 \(0\) 可以填出来后暴力 kmp,看与原串是否一样。

证明:题解给了个挂掉的链接。。。

注意这题空间 8M,一些常数不够优秀的写法(比如递归地构造)会 MLE,别问我咋知道的

const int N = 2e5+1;
int T;
char s[N]; int n,n1,f[N],g[N],pos[N]; void kmp(int *nxt,int l,int r) {
for(int i = l+1, j = nxt[l]; i <= r; ++i) {
while( j && s[j+1] != s[i] ) j = nxt[j];
if( s[j+1] == s[i] ) ++j;
nxt[i] = j;
}
}
bool check(int u) {
for(; u; u = f[u]) if( f[u] != g[u] ) return 0;
return 1;
}
void solve() {
scanf("%s",s+1); n = strlen(s+1);
kmp(f,1,n);
For(i,1,n) s[i] = '0'; s[n+1] = 0;
for(int i = n; i; i = f[i]) pos[++n1] = i; reverse(pos+1,pos+n1+1);
s[pos[1]] = '0'+(pos[1]!=1), kmp(g,1,pos[1]);
For(i,2,n1) {
if( pos[i-1]*2 >= pos[i] )
For(j,pos[i-1]+1,pos[i]) s[j] = s[pos[i-1]-(pos[i]-j)];
else {
For(j,pos[i]-pos[i-1]+1,pos[i]) s[j] = s[pos[i-1]-(pos[i]-j)];
kmp(g,pos[i-1],pos[i]);
if( !check(pos[i]) ) s[pos[i]-pos[i-1]] = '1';
}
kmp(g,pos[i-1],pos[i]);
}
printf("%s\n",s+1);
} signed main() {
scanf("%d",&T);
while( T-- ) {
n1 = 0;
solve();
}
return iocl();
}

吐嘈

T1 题面说的“数据有梯度”恐怕指的是一个测试点内每组数据有梯度,不会正解的人只能拿到 0/10pts,导致今天爆 \(0\) 的人格外多。

虽然这次的题是拼的,但看 T2 T3 的原比赛出了 \(3\) 道计数,让我这种计数很弱的人体验极差。

T4 貌似是模拟赛中第一次出构造

20210819 Emotional Flutter,Medium Counting,Huge Counting,字符消除2的更多相关文章

  1. csp-s模拟47 Emotional Flutter,Endless Fantasy题解

    题面:https://www.cnblogs.com/Juve/articles/11558523.html A:Emotional Flutter 如果起点确定,那么我们后面走的点都是固定的,及mo ...

  2. [hihoCoder]#1039 : 字符消除

    Description 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的: 1)如果s包含长度超过1的由相同字母组成的子串,那么这些 ...

  3. 【hihoCoder】#1039 : 字符消除 by C solution

    #1039 : 字符消除 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消 ...

  4. hihoCoder 1039:字符消除(字符串处理)

    #1039 : 字符消除 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消 ...

  5. 【面试笔试算法】Program 6: 字符消除(hiho题库)

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的: 1) ...

  6. hihocoder #1039 : 字符消除 ( 字符串处理类 ) 好久之前做的题目,具体的算法代码中阅读吧

    #1039 : 字符消除 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消 ...

  7. 【HIHOCODER 1039】 字符消除

    链接 问题描述 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的: 1)如果s包含长度超过1的由相同字母组成的子串,那么这些子串会被 ...

  8. [CSP-S模拟测试]:字符消除2(hash+KMP)

    题目背景 生牛哥终于打通了“字符消除”,可是他又被它的续集难倒了. 题目传送门(内部题52) 输入格式 第一行$n$表示数据组书.接下来每行一个字符串.(只包含大写字母) 输出格式 每组数据输出一个$ ...

  9. hihoCoder 1039 字符消除 最详细的解题报告

    题目来源:字符消除 解题思路: 1.在给定字符串中的任意位置插入'A'.'B'.'C'中的任意一个字符,然后计算插入后的字符经过消除后最短的字符串长度: 2.在计算字符消除后最短长度时,智能一遍一遍的 ...

随机推荐

  1. Oracle 对 sql 的处理过程

    当你发出一条 sql 语句交付 Oracle,在执行和获取结果前,Oracle 对此 sql 将进行几个步骤 的处理过程: 1.语法检查(syntax check)   检查此 sql 的拼写是否语法 ...

  2. java封装基础详解

    java封装基础详解 java的封装性即是信息隐藏,把对象的属性和行为结合成一个相同的独立单体,并尽可能地隐藏对象的内部细节. 封装的特性是对属性来讲的. 封装的目标就是要实现软件部件的"高 ...

  3. leetcode 有效三角形的个数

    题目描述: 平明伞兵解法: 既然要求满足三角形要求的三边,简单来说,就是最短两边之和大于第三边,所以,第一步Arrays.sort().先排序,然后直接伞兵暴力法,三重循环.当然最后肯定是能跑出来的, ...

  4. 数据库技术中的触发器(Trigger)——和ContentObserver功能类似

    刚总结过ContentObserver的作用和特点,顺便总结下数据库技术中的触发器(Trigger),触 发 器 分 为 表 触 发 器 . 行 触 发 器

  5. Jarvis OJ部分逆向

    Jarvis OJ部分逆向题解 很久没有写博客了,前天上Jarvis OJ刷了几道逆向,保持了一下感觉.都是简单题目,写个writeup记录一下. easycrackme int __cdecl ma ...

  6. 跟你说个笑话,硕士毕业两年,月薪10k,天天面向CV编程

    "枯燥乏味的一天,又tm要开始了". 早上10:00,程序员毛毛带着路上买的早餐,打开24英寸的显示屏,去某论坛查一下昨天没有解决的bug. 9 个小时增删改查.搬砖写代码的一天又 ...

  7. BBPlayerView

    GitHub 仓库地址 一个高度封装的视频播放器视图,基于 AVPlayer.AVPlayerLayer.AVPlayerItem. 继承自 UIView,可以当做一般视图使用,适用于 Swift 和 ...

  8. Java代码操作zookeeper

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  9. 5、Python断言及常用断言函数总结

    Python断言 Python assert 语句,又称断言语句,可以看做是功能缩小版的 if 语句,它用于判断某个表达式的值,如果值为真,则程序可以继续往下执行:反之,Python 解释器会报 As ...

  10. Lab: Brute-forcing a stay-logged-in cookie:点击保持登录状态返回的Cookie里面破解账号密码靶场复盘

    靶场内容: 此实验室允许用户在关闭浏览器会话后仍保持登录状态.用于提供此功能的 cookie 容易受到暴力破解. 为了解决实验室问题,暴力破解 Carlos 的 cookie 以访问他的"我 ...