首页 > 其他分享 >LY1366 [ 20231005 NOIP 模拟赛 T0 ] 加固

LY1366 [ 20231005 NOIP 模拟赛 T0 ] 加固

时间:2023-10-08 16:47:16浏览次数:34  
标签:26 20231005 NOIP int sum T0 array include getchar

题意

设 \(T\) 是由 \(26\) 小写英文字母排列得到的字符串。

\(T'\) 由 \(T\) 复制若干次得到。

给定字符串 \(S\) 为 \(T'\) 的子序列,求 \(T'\) 的最小复制次数。

保证出现的不同字母不超过 \(20\) 种

\(1 \le |S| \le 10^5\)

Sol

一个巧妙的转化,考虑将 \(T\) 串作为字典序,那么当前 \(S\) 的答案显然为两两相邻字母不满足字典序的个数之和。

考虑暴力枚举所有 \(T\) 串可能的情况,然后结合 \(26 * 26\) 的桶计算答案。

这个做法是 \(\sum S_i !\) 的,(\(\sum S_i\) 表示不同的字符个数)。

可以通过 \(40%\) 的数据。

一个经典的思路,考虑把暴力全排列变成状压枚举。我们显然只关心当前 \(T\) 串的最后一个字符,以及当前包含哪些字符。

这样转移是 \(\sum S_i^2\) 的,状态数是 \(2^{\sum S_i^2}\)。本题里 \(\sum S_i\) 为 \(20\)。并且带有 \(\frac{1}{2}\) 的常数。

可以通过本题。

Code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <array>
using namespace std;
#ifdef ONLINE_JUDGE

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 23], *p1 = buf, *p2 = buf, ubuf[1 << 23], *u = ubuf;

#endif
int read() {
	int p = 0, flg = 1;
	char c = getchar();
	while (c < '0' || c > '9') {
		if (c == '-') flg = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		p = p * 10 + c - '0';
		c = getchar();
	}
	return p * flg;
}
string read_() {
	string ans;
	char c = getchar();
	while (c < 'a' || c > 'z')
		c = getchar();
	while (c >= 'a' && c <= 'z') {
		ans += c;
		c = getchar();
	}
	return ans;
}
void write(int x) {
	if (x < 0) {
		x = -x;
		putchar('-');
	}
	if (x > 9) {
		write(x / 10);
	}
	putchar(x % 10 + '0');
}
const int N = 1.5e6 + 5, M = 28, inf = 0x7f7f7f7f;

array <array <int, M>, M> isl;
array <array <int, N>, M> cur;
array <int, M> dfn, idx;

array <int, N> f;
int main() {
	freopen("reinforce.in", "r", stdin);
	freopen("reinforce.out", "w", stdout);
	string s = read_();
	int n = s.size();
	s = " " + s;
	int tot = 0;
	for (int i = 1; i < n; i++)
		isl[s[i] - 'a'][s[i + 1] - 'a']++;
	for (int i = 1; i <= n; i++) {
		if (dfn[s[i] - 'a']) continue;
		tot++, dfn[s[i] - 'a'] = tot, idx[tot] = s[i] - 'a';
	}
	f.fill(inf);
	f[0] = 1;
	for (int T = 1; T < 1 << tot; T++) {
		for (int i = 1; i <= tot; i++) {
			if (~T & (1 << (i - 1))) continue;
			int sum = f[T ^ (1 << (i - 1))];
			for (int j = 1; j <= tot; j++) {
				if (~T & (1 << (j - 1))) continue;
				sum += isl[idx[i]][idx[j]];
			}
			f[T] = min(f[T], sum);
		}
	}
	write(f[(1 << tot) - 1]), puts("");
	return 0;
}

标签:26,20231005,NOIP,int,sum,T0,array,include,getchar
From: https://www.cnblogs.com/cxqghzj/p/17749541.html

相关文章

  • LY1374 [ 20231008 NOIP 模拟赛 T2 ] 机房惨案
    题意给定一棵树,每次操作将一个点染成黑色。求询问的点到所有黑点的路径编号最小值。**数据保证第一次为染色操作**Sol注意到保证第一次为染色。考虑钦定根节点为染色的点。那么对于所有染色操作,暴力记录染色的点到根节点的路径上所有点的贡献。每个点只会贡献一次,这部分......
  • P1003 [NOIP2011 提高组] 铺地毯
    第一思路:开一个N*N的数组,每次都扫一遍地毯范围并标记编号然后你会发现:喜提MLE为什么呢?我们来看看数据范围0≤n≤1e4n的范围是1e4,数组总大小为1e16,大约需要4000TB的内存空间服务器也不带这么玩的正解:将地毯信息用结构体存储structnode{ intx1,y1,x2,y2;//x1......
  • 2023NOIP A层联测5
    A.T1(cook)复合题,考场上只做出来了分块的部分,没有想到那个组合数求和可以用莫队分块部分具体不说了,对散块部分加权时,可以采用归并优化时间复杂度(因为我北卡长哩,卡到了晚饭之后,卡了一下午,好欸!)现在考虑问题\(\sum_{i=0}^{k}\dbinom{x}{i}\)令$(S(n,m)=\sum_{i=0}^{m}C......
  • 洛谷 P1969 [NOIP2013 提高组] 积木大赛 - 小思维
    洛谷P1969[NOIP2013提高组]积木大赛[NOIP2013提高组]积木大赛题目描述春春幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为\(n\)的大厦,大厦可以看成由\(n\)块宽度为\(1\)的积木组成,第\(i\)块积木的最终高度需要是\(h_i\)。在搭建开始之前......
  • 2023NOIP A层联测6
    A.万花筒考虑发现每次相当于把x和x+d连边,不难发现最后一定是一些环证明可以看白简B.冒泡排序趟数期望写一下我曾经比较疑惑的点为什么inv和p一定一一对应,因为我们发现只要给出我们一个inv我们就可以倒推出唯一确定的p,所以它们是一一对应的关系这道......
  • P3953 [NOIP2017 提高组] 逛公园
    Description策策同学特别喜欢逛公园。公园可以看成一张\(N\)个点\(M\)条边构成的有向图,且没有自环和重边。其中\(1\)号点是公园的入口,\(N\)号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花的时间。策策每天都会去逛公园,他总是从\(1\)号点进去,从\(N\)......
  • LY1371 [ 20231007 NOIP 模拟赛 T0 ] 十一之争
    题意给定一个长度为\(n\)的数字串\(s\)和只包含yo的字符串\(t\),yoimiya会和oimiya玩\(n\)轮游戏,初始有一个数字串\(x\)为\(0\),每次:如果\(t_i\)是y则是yoimiya操作,如果是o则是oimiya操作。每次操作:将\(s_i\)或者\(0\)加入\(x\)的末尾。如果最......
  • Ynoi2012 NOIP2016 人生巅峰
    Day\(\text{XXX}\)。注意到修改是易于复合的立方操作,而且值域非常小,所以可以直接\(O(v\logm)\)预处理出对每个\(i\in[0,v)\)操作了\(2^{j}\lem\)次的结果,维护出每一位被修改了多少次,查询某一位的值直接倍增\(O(\logm)\)即可。然后这个限制很弱,因为如果区间内有重复......
  • 33dai NOIP2023模拟赛35 赛后总结
    做题历程8:00~8:40写A。8:40~9:40看B,C想B,写B。9:40~10:40手玩了一下C,推出了那个规律。10:40~11:20写C。11:20~12:00看了看D,尝试写dp暴力,没空,最后随便写了写。总结写代码要注意细节,不然容易挂。题解A倒序做一遍双指针,没什么好说的。不过有很多人用奇......
  • 2023年石门中学NOIP模拟测试(2023.10.6)
    原题大战T1范围\(n\leq10^{14}\)。不用动脑,打个表找找规律。考虑一个数\(x\),在\(1\simn\)中包含\(x\)这个约数的个数为\(\left\lfloor\dfrac{n}{x}\right\rfloor\),那么既然是异或,只需要判断奇偶性算贡献即可。然后你发现这玩意显然可以整除分块,算连续一段贡献,只需......