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\),蛮好。

浙公网安备 33010602011771号