2020.11.25
考場改了代碼忘了往文件夾里放,,,
光榮爆零
最長上升子序列可以用樹狀數組解決
樹狀數組記得離散化
暴力可以打表找規律
組合數的結論題往卡特蘭數上靠一下
2020.11.19
\(u1s1\)沒掛分舒服極了
但是改題的時候遇到一些磕磕絆絆
總結
ZYB玩字符串
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
inline int read(){
int x = 0, w = 1;
char ch = getchar();
for(; ch > '9' || ch < '0'; ch = getchar()) if(ch == '-') w = -1;
for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
return x * w;
}
const int ss = 700;
const unsigned long long base = 233;
unsigned long long ha1[ss], ha2[ss], power[ss];
char ch[ss], cpy[ss], b[ss], ass[ss];
inline bool check(register char *a, register char *b){
memcpy(ass, a, sizeof a);
register int n = strlen(a + 1), len = strlen(b + 1);
memset(ha2, 0, sizeof ha2);
for(register int i = 1; i <= len; i++)
ha2[i] = ha2[i - 1] * base + b[i];
while(n){
register bool flag = 0;
for(register int l = 1; l + len - 1 <= n; l++){
flag = 0;
memset(ha1, 0, sizeof ha1);
for(register int i = 1; i <= n; i++)
ha1[i] = ha1[i - 1] * base + a[i];
register int r = l + len - 1;
register unsigned long long tmp = ha1[r] - ha1[l - 1] * power[r - l + 1];
if(tmp == ha2[len]){
flag = 1;
register int cnt = 0;
memset(ass, 0, sizeof ass);
for(register int i = 1; i <= l - 1; i++)
ass[++cnt] = a[i];
for(register int i = r + 1; i <= n; i++)
ass[++cnt] = a[i];
n -= len;
memcpy(a, ass, sizeof ass);
break;
}
}
if(!flag) break;
}
if(n) return 0;
return 1;
}
signed main(){
freopen("string.in", "r", stdin);
freopen("string.out", "w", stdout);
register int T = read();
power[0] = 1;
for(register int i = 1; i <= 605; i++)
power[i] = power[i - 1] * base;
while(T--){
string ans1, ans2;
scanf("%s", ch + 1);
register int n = strlen(ch + 1);
memcpy(cpy, ch, sizeof ch);
register bool flag = 0;
for(register int len = 1; len <= n; len++){
if(flag) break;
for(register int i = 1; i + len - 1 <= n; i++){
if(flag) break;
memcpy(ch, cpy, sizeof cpy);
memset(b, 0, sizeof b);
register int num = 0;
for(register int j = i; j <= i + len - 1; j++)
b[++num] = ch[j];
if(check(ch, b)){
flag = 1;
ans1 = b + 1;
break;
}
}
}
memcpy(ch, cpy, sizeof cpy);
reverse(ch + 1, ch + 1 + n);
memcpy(cpy, ch, sizeof ch);
flag = 0;
for(register int len = 1; len <= n; len++){
if(flag) break;
for(register int i = 1; i + len - 1 <= n; i++){
if(flag) break;
memcpy(ch, cpy, sizeof cpy);
memset(b, 0, sizeof b);
register int num = 0;
for(register int j = i; j <= i + len - 1; j++)
b[++num] = ch[j];
if(check(ch, b)){
flag = 1;
ans2 = b + 1;
break;
}
}
}
reverse(ans2.begin(), ans2.end());
if(ans1.size() < ans2.size()) cout << ans1 << endl;
else if(ans2.size() < ans1.size()) cout << ans2 << endl;
else cout << min(ans1, ans2) << endl;
}
}
注意事項
- \(hash\)的時候,想要查詢某一個區間的字符或者數字\(ha[r] - ha[l - 1] * power[r - l + 1]\),思想類似差分
- 同樣還是\(hash\),預處理\(power\)數組的時候,記得\(power[0] = 1\)
- 不旦多測要清空,判斷字符串是否合法如果出現了修改原數組的情況,也要清空,或者另開一個新數組
- \(string\)類型之間可以直接按照字典序排序,一個\(string\)也可以用\(reverse\)顛倒順序,像這樣\(reverse(ans.begin(), ans.end());\)
2020.10.26
眾所周知
\(1<<20=1048576\)
沒錯我就是無腦開了\(1e6\)
2020.10.21
\(150\to90\)
\(T2dfs\)沒寫出來
還是要練暴力
2020.10.20
晚上把會的分拿到了
沒有掛分++
多多少少比自己之前強了
嘿嘿
加油
發現自從開了這玩意就沒掛分了開心
雖然還是一如既往的爛
2020.10.18
\(T3\)理解錯題目了,狂敲\(4.0k\)
於是
導致沒時間打別的題了,快樂爆零
前言
這是一個棧
老規矩還是會從下往上更新
感覺開這個坑有點晚了
不過好在大部分出過的錯誤之前在博客里面都記錄過
回去翻翻還是有不錯的效果的
明天就第六階段了
希望不要再掛分了
把會的分數一定拿到
加油!