首页 > 其他分享 >2024CSP前集训10.9

2024CSP前集训10.9

时间:2024-10-09 19:23:37浏览次数:1  
标签:ch 10.9 len 集训 int maxN br read 2024CSP

不想学东西了,,,

T1

普及题,之前还做过,没啥好说的。

T2

95

kmp 不对,挂了 5 分。

莫队奇偶性优化还是要加的。

对 \(s_{i,\dots,n}\) 跑 kmp,也就是跑了 \(n\) 遍,答案是:

	while (m--) {
		int l = read(), r = read();
		int res = 0;
		for (int i = l; i <= r; i++)
			for (int j = i; j <= r; j++)
				if (p[i][j])
					if (vs[j][p[i][j]] == 0)
						res++, vs[j][p[i][j]] = 1;
		cout << (r - l + 1) * (r - l + 2) / 2 - res << '\n';
		memset(vs, 0, sizeof(vs));
	}
// 这是暴力

统计有多少个重复的串,再用总共的减去。
如果某个位置的 \(border\) 不为 \(0\),就说明前面出现了这个串,但是要注意每个位置同样长度的串只减一次。

改成莫队加减都很方便。

复杂度 \(O(n^2\sqrt q)\),但跑的挺快。

不会正解。

#include <bits/stdc++.h>

using namespace std;

int read() {
	int x;
	cin >> x;
	return x;
}

const int maxN = 3e3 + 7, maxM = 2e4 + 7;

int n, m;

string s;

int p[maxN][maxN];

int vs[maxN][maxN];

int pos[maxN], len;

struct ques {
	int l, r, id;
} q[maxM];
int ans[maxM];

int l = 1, r;
int res;

void addr() {
	for (int i = l; i <= r; i++)
		if (p[i][r]) {
			if (!vs[r][p[i][r]])
				res++;
			vs[r][p[i][r]]++;
		}
}
void addl() {
	for (int i = l; i <= r; i++)
		if (p[l][i]) {
			if (!vs[i][p[l][i]])
				res++;
			vs[i][p[l][i]]++;
		}
}
void dell() {
	for (int i = l; i <= r; i++)
		if (p[l][i]) {
			vs[i][p[l][i]]--;
			if (!vs[i][p[l][i]])
				res--;
		}
}
void delr() {
	for (int i = l; i <= r; i++)
		if (p[i][r]) {
			vs[r][p[i][r]]--;
			if (!vs[r][p[i][r]])
				res--;
		}
}

int main() {
	freopen("substring.in", "r", stdin);
	freopen("substring.out", "w", stdout);

	// ios::sync_with_stdio(false), cin.tie(nullptr);

	n = read(), m = read();
	cin >> s;
	s = '@' + s;
	for (int st = 1; st <= n; st++) {
		string tmp;
		for (int i = st; i <= n; i++)
			tmp += s[i];
		int *br = p[st];
		br[0] = 0;
		for (int i = 1; i < n - st + 1; i++) {
			int j = br[i - 1];
			while (j > 0 && tmp[i] != tmp[j])
				j = br[j - 1];
			if (tmp[i] == tmp[j])
				br[i] = j + 1;
			else
				br[i] = 0;
		}
		for (int i = n - st, j = n; i >= 0; i--, j--)
			br[j] = br[i], br[i] = 0;
	}

	len = max(n / sqrt(m), 1.0);
	for (int i = 1; i <= n; i++)
		pos[i] = (i - 1) / len + 1;

	for (int i = 1; i <= m; i++)
		q[i].l = read(), q[i].r = read(), q[i].id = i;
	sort(q + 1, q + m + 1, [](ques A, ques B) {
		if (pos[A.l] == pos[B.l])
			return (pos[A.l] & 1) ? A.r < B.r : A.r > B.r;
		return A.l < B.l;
	});

	for (int i = 1; i <= m; i++) {
		while (r < q[i].r)
			r++, addr();
		while (q[i].l < l)
			l--, addl();
		while (l < q[i].l)
			dell(), l++;
		while (q[i].r < r)
			delr(), r--;
		int len = q[i].r - q[i].l + 1;
		ans[q[i].id] = len * (len + 1) / 2 - res;
	}

	for (int i = 1; i <= m; i++)
		cout << ans[i] << '\n';
}

T3

#include <bits/stdc++.h>

using namespace std;

using ubt = long long;

int read() {
    int s = 0, w = 1;
    char c = getchar();
    while (!isdigit(c)) {
        if (c == '-')
            w = -w;
        c = getchar();
    }
    while (isdigit(c)) {
        s = s * 10 + c - 48;
        c = getchar();
    }
    return w * s;
}
void pr(ubt x) {
    if (x < 0)
        putchar('-'), x = -x;
    if (x > 9)
        pr(x / 10);
    putchar(x % 10 + 48);
}
#define end_ putchar('\n')
#define spc_ putchar(' ')


const int maxN = 4e5 + 7;

struct trie {
    int n;
    int ch[maxN][26];
    ubt cnt[26];
    void insert(string s, bool ty) {
        int u = 0, len = s.length();
        if (!ty) {
            for (int i = 0; i < len; i++) {
                int o = s[i] - 'a';
                if (!ch[u][o])
                    ch[u][o] = ++n;
                u = ch[u][o];
            }
        }
        else {
            for (int i = len - 1; ~i; i--) {
                int o = s[i] - 'a';
                if (!ch[u][o])
                    ch[u][o] = ++n, cnt[o]++;
                u = ch[u][o];
            }
        }
    }
} t1, t2;

int n;
ubt ans;

bool ok[26], flag[26];

int main() {
    freopen("magic.in", "r", stdin);
    freopen("magic.out", "w", stdout);

    n = read();
    for (int i = 1; i <= n; i++) {
        string s;
        cin >> s;
        t1.insert(s, false), t2.insert(s, true);
        int len = s.length();
        ok[s[len - 1] - 'a'] = true;
        if (len == 1 && !flag[s[0] - 'a'])
            ans++, flag[s[0] - 'a'] = true;
    }
    for (int u = 1; u <= t1.n; u++)
        for (int o = 0; o < 26; o++)
            if (!t1.ch[u][o])
                ans += t2.cnt[o];
            else
                ans += ok[o];
    pr(ans), end_;
}

标签:ch,10.9,len,集训,int,maxN,br,read,2024CSP
From: https://www.cnblogs.com/ccxswl/p/18454953

相关文章

  • 10.9
    不会数学真是抱歉了!不会dp真是抱歉了!说好的\(NOIP\)模拟赛呢,开幕给我端上来这么一坨。明天有体育课。A.树上独立集贪心,设\(f_i\)代表\(i\)子树内有多少个未匹配点,若\(\sum\limits_{v\inson_u}f_v>0\)则\(f_i=\sum\limits_{v\inson_u}f_v-1\),否则\(f_i=1\),若......
  • 2024.10.9 总结
    决定以后分开写,显的博客多。A:首先考虑对给定树计算权值,假设我们已经知道了一个权值最小的划分,那么可以通过调整得到新的划分使得权值不变,目的是简化虚树的形态。考虑该划分中任意一个集合形成的虚树,有两种情况:如果根节点\(r\)存在于任何一个最大独立集中,即\(f_{r,1}>f_{r,0}......
  • 10.9(NOIP 模拟赛 #10)
    2025--炼石计划--10月06日--NOIP模拟赛#10【订正】-比赛-梦熊联盟(mna.wang)复盘T1计数题,感觉不难。用样例模拟了一下,找到一个较优的去重方式。然后过了样例。此时8:10。T2好像又是矩阵加速。想正解。想不出来,只能做到\(\mathcalO(n^6\logk)\)的复杂度。......
  • 「闲话」CSP 集训记梦
    一个不写闲话的oier不能证明他是一个oier其实写这个是因为10.5晚上做梦了,所以记录一下建议跳过9.28和10.1部分9.28上午模拟赛。T1一开始搞了个贪心假做法,发现过了大样例,但显然不对吧!也不会其他的解法,先交了一发。然后开始写暴力拍了一手,两千组拍出了个Wa的,手......
  • 2023牛客OI赛前集训营-提高组(第三场) - 题解汇总
    空位与数(game)贪心即可,因为正正得正,负负也得正,所以将两个数组分别按照正负性分开,然后让正数里面大的配上大的,负数里面绝对值大的配上绝对值大的,这样可以让正积总和尽量大。剩下不足的(必须要一正一负相乘的)让绝对值大的配绝对值小的,这样可以让负积总和尽量小。#include<cstdio>#i......
  • 2024初秋集训——提高组 #33
    C.星际航行题目描述给定一个\(N\)个点\(M\)条边的无向带权图。我们定义一条路径的长度为路径上边权最大值。有\(Q\)次查询,第\(i\)次查询从\(u\)到其他\(N-1\)个点的最短路径中路径长度第\(k\)大的长度。思路首先,此题显然只会在最小生成树上选择路径。所以我们......
  • NOIP2024集训 Day47 总结
    前言人有两次生命,当他意识到只有一次的时候,第二次生命就开始最小生成树和二分图匹配专题,感觉总体都比较套路。但是这些套路为啥感觉见都没见过啊,怪不得做这么慢。色观察到对于最终答案显然都是最小生成树上一条两个端点颜色不同的边。而这个题并不会改变图的形态,仅仅是改......
  • NOIP2024集训Day47 生成树+二分图
    NOIP2024集训Day47生成树+二分图B.[THUPC2022初赛]最小公倍树直接建边显然不行,考虑优化建边。对于两个点\(u,v\),\((u,v)\)的边权为\(\displaystyle\operatorname{lcm}(u,v)=\frac{u\timesv}{\gcd(u,v)}\),显然应该选择\(\gcd(u,v)\)尽可能大的点对连边,也就是......
  • CSP2024 前集训:csp-s模拟10
    前言T2赛时不会,T3没有想到移项遂打了个背包得\(50pts\),T4又放回滚莫队板子,结过开太晚了没打完,以后板子麻烦放靠前点谢谢。T1需要线性基思想,听5k讲完貌似懂了,但是学了再回来补吧。T2首先选择一个度数不是\(1\)的点当根。对于一个非叶子节点\(p\)被扫到有两种情况......
  • [43] (CSP 集训) CSP-S 模拟 10
    B.清扫考虑从叶子节点往上推首先可以发现的几个性质子树内需要消除的数,要么通过子树根节点“发送”到上面(只经过子树内一个叶节点),要么通过自己的叶节点解决对于子树内既不是根也不是叶节点的节点,节点上的值只能由这一支路的叶节点消除,所以如果他节点上的值和下面节点“发......