Y
K
N
U
F

CSP-S游记

DAY-2

快乐的CSP-S前最后一场赛拟模

1

简单根号分治,可以很简单的做到 \(O(c\sqrt c)\) 的复杂度,不过赛时好像一车人写得 \(O(c^\frac53)\) 还赖卡常?不理解,但不反驳。

2

是不会的 SOS DP。非常美丽的东西,赛时写了 \(O(n2^m)\) 的恶心东西。然后就,改改吧……

快 csp 了你让我学新东西?????
快 csp 了你让我学新东西?????
快 csp 了你让我学新东西?????
快 csp 了你让我学新东西?????
快 csp 了你让我学新东西?????
快 csp 了你让我学新东西?????

不改了,放了。

3

\(O(Tnmq)\) 的暴力,但是和 \(O(Tn^2m^2q)\) 是一个分?难绷。

4

没打出暴力。

DAY-1

一个问题,我现在的心态是什么样子的,我真的慌吗,我真没慌么。感觉自己处在一个极矛盾的位置上。

啊,毕竟还是那个问题,我只是一个可爱的零基础,无论如何到了这里差不多也行吧,反正总不会是空手而归。

有时候真的会想,如果我再早点接触到这里,哪怕……

我想,这实在是无法去想了。

如果真的获得向下走的权利的话,我把什么百年前就说要写的“记梦”写写吧。

好想抒抒情,发现自己根本没有那种能力,真是有趣极了。

想听 \(\text{Last | Eternity}\) 了,感觉会很合适。

不,准确讲应该听 \(\text{Last | Moment}\) 才应该对吧。

好混乱,就这样了。


发现一天没有写完一道题,感觉自己糖丸了。

如此状态,如何CSP???

Day0

怎么就到了如此地步?

不知道心情怎样,发现马上出发然后就碰不到电脑了。

不知道手感会不会崩溃。

感觉自己绿的思维题都难做了,好烦哦。

真是的。。。。

祝好吧。


玩了一路小手机,还睡了睡觉,挺舒服的。

唯一不足是车上我就在教练后面,有点吓人的。

教练带路的时候严格一次性走对了 0 次路,强的可怕。

Day1

早上吃的有点人机。

会议室很抽象,教练员发明了插排串联插排串联插排,构成了多叉树形结构,感觉有点危险。

有非常多的橘子香蕉可以吃,感觉这很怪,但是还是吃了很多(包括一部分 why20031113 和 GonTata 的)。

然后颓了一上午。

中午的时候因为没有收 GonTata 的电脑,所以一起玩了有趣双人小游戏,一中午刚好打完。真有趣。

下午考试。

我们考场出了点事故,晚进场 \(10\min\),多唠了会嗑,心态变好了。

开考后我发现我是最后一排的,有趣,能敞开坐,蛮好。

唯一问题是我身边的可爱初一小朋友一直吃东西,很吵(还问我吃么)。

(结束后和他聊了聊,的确可爱就是了)

看题。

T1 简单题,唯一问题是条件诈骗,一开始看数据“随机”我还想直接贪心。发现没过样例才换的反贪。

T2 一眼出 \(O(m\log m 2^k)\),简单优化为 \(O(m 2^k)\),算出来好像是 \(10^9\) 次运算。加了加剪枝,感觉能过就没再想了,考后发现好像可以做 \(O(nk2^k)\)。不过当时感觉差不多(然而差很多)。

T3 想了一个 \(O(L2\sqrt {L1})\) 的做法,直接就写了,得分大概是在 \([25,100]\) 的抽象区间,不过大样例跑的很快,得分得看出题人有没有想出这个暴力了,又或者全是 \(a,b\) 的点也可以卡卡我的做法的剪枝。

然后考完了告诉我存在 \(|t_1| \neq |t_2|\) 哦一车人没发现啊,那没事了。

补充:过了你谷数据。

为什么是这个唐诗复杂度

我将写一个暴力并证明它为什么是 \(O(L_2\sqrt{L_1})\) 的。

考虑对于一对 \(|t_1| = |t_2|\),显然可以在 \(t_1\) 上找每一个不同长度不同起点的子串,然后在 \(s_1\) 中寻找有没有相同的,并比对 \(s_2\) 是否等于 \(t_2\) 的子串,这样直接做的复杂度很烂。

容易发现只有出现在集合 \(L = \{x|x=|s_1|\}\) 里的长度才有意义,然后就可以考虑在 \(t_1\) 上找每一个不同起点且长度属于 \(L\) 的子串,容易发现 \(L\) 的元素个数是根号级别的,然后就结合字符串哈希就做到 \(O(L_2\sqrt{L_1})\) 了。

然后还可以剪枝,考虑只枚举 \(t_{1,0} = s_{1,0}\) 时的 \(|s_1|\),然后就跑的很快,不过不知道会不会卡这种做法的说,现在才慌,后悔为什么场上没有多卡卡常数。

代码(场下还原款):

// code by 樓影沫瞬_Hz17
#include <bits/stdc++.h>
using namespace std;
 
#define getc() getchar_unlocked()
#define putc(a) putchar_unlocked(a)
#define en_ putc('\n')
#define e_ putc(' ')
 
// #define int long long
using pii = pair<int, int>;
 
template<class T1, class T2> T1 max(T1 a, T2 b) { return a > b ? a : a = b;}
template<class T1, class T2> T1 min(T1 a, T2 b) { return a < b ? a : a = b;}
 
constexpr int N = 2e5 + 10;
 
using ull = __uint64_t;
constexpr ull p = 131;
ull pp[5000010];
ull hs[200010][2];

int n, q;

vector<int> pos[200];

ull th1[5000010];
ull th2[5000010];

inline ull shs1(int l, int r) {
    if(l > r) return 0;
    return th1[r] - (l - 1 >= 0 ? th1[l - 1] : 0) * pp[r - l + 1];
}   

inline ull shs2(int l, int r) {
    if(l > r) return 0;
    return th2[r] - (l - 1 >= 0 ? th2[l - 1] : 0) * pp[r - l + 1];
}   

unordered_map<ull, unordered_map<ull, int> > mp;

signed main() {
	#ifndef ONLINE_JUDGE
		freopen("in.ru", "r", stdin);
		freopen("out.ru", "w", stdout);
	#endif
    ios::sync_with_stdio(0);
    cin >> n >> q;
    int mx = 0;
    for(int i = 1; i <= n; i ++) {
        string s1, s2;
        cin >> s1 >> s2;
        int l = s1.size();
        mx = max(mx, l);
        for(int j = 0; j < l; j ++) {
            hs[i][0] = hs[i][0] * p + s1[j];
            hs[i][1] = hs[i][1] * p + s2[j];
        }
        pos[s1[0]].push_back(l);
        mp[hs[i][0]][hs[i][1]] ++;
    }
    for(int i = 1; i < 200; i ++) {
        if(pos[i].empty()) continue;
        sort(pos[i].begin(), pos[i].end());
        pos[i].erase(unique(pos[i].begin(), pos[i].end()), pos[i].end());
    }
    for(int i = pp[0] = 1; i <= mx; i ++) pp[i] = pp[i - 1] * p;

    for(int i = 1; i <= q; i ++) {
        string t1, t2;
        int ans = 0;
        cin >> t1 >> t2;
        if(t1.size() != t2.size()) {
            cout << 0 << '\n';
            continue;
        }
        int ll = t1.size();
        th1[0] = t1[0];
        th2[0] = t2[0];
        for(int i = 1; i < ll; i ++) {
            th1[i] = th1[i - 1] * p + t1[i];
            th2[i] = th2[i - 1] * p + t2[i];
        }
        int mx = 0, mr = ll - 1;
        for(; mx < ll; mx ++) if(t1[mx] != t2[mx]) {
            mx --;
            break;
        }
        for(; mr >= 0; mr --) if(t1[mr] != t2[mr]) {
            mr ++;
            break;
        }
        for(int i = 0; i <= mx + 1; i ++) {
            uint j = lower_bound(pos[t1[i]].begin(), pos[t1[i]].end(), mr - i) - pos[t1[i]].begin();
            for(; j < pos[t1[i]].size(); j ++) {
                int L = pos[t1[i]][j];
                if(i + L < mr) continue;
                if(i + L > ll) continue;;
                ull k1 = shs1(i, i + L - 1);
                ull k2 = shs2(i, i + L - 1);
                if(mp.count(k1)) {
                    if(mp[k1].count(k2)) {
                        ans += mp[k1][k2];
                    }
                }
            }
        }
        cout << ans << '\n';
    }
}   
// 星間~ 干渉~ 融解~ 輪迴~ 邂逅~ 再生~ ララバイ~

T4 只写了基础暴力,有 \(8\) 分。

还是好气哦,为什么 T3 这么阴啊。

感觉分数会在 \(100+100+100+8\)\(100+72+0+8\) 之间了……

主要就是看 T3 有没有很多 hack 了。

生气。

真生气吧。

真生气吗?

算了。

还是不生气了……

update on Day inf

出分了,是 \(100 + 80 + 100 + 12\),蛮好。

posted @ 2025-10-29 16:27  樓影沫瞬_Hz17  阅读(105)  评论(5)    收藏  举报