呃呃呃,这个极其菜的人又来总结了。
A - Doors in the Center
嗯,似乎英文水平有待提高,竟然没看懂。
翻译以后,嗯,有点意思。
哦,秒了。
#include<bits/stdc++.h>
using namespace std;
int main(){int n;cin>>n;for(int i=1;i<=(n+1)/2-1;i++){cout<<"-";}if(n%2==0)cout<<"==";else cout<<"=";for(int i=1;i<=(n+1)/2-1;i++){cout<<"-";}puts("");return 0;
}
B - Full House 3
咦,又没看懂英文,难道是英语水平下降了?
9分26秒,A了。
感觉进度有些慢。
#include<bits/stdc++.h>
using namespace std;
int n=7;
int a,f[15],s,e;
int main(){for(int i=1;i<=n;i++){cin>>a;++f[a];}for(int i=1;i<=13;i++){if(f[i]>=3)++s;else if(f[i]>=2)++e;}if(s>=2){cout<<"Yes\n";}else if(s==1){if(e>=1){cout<<"Yes\n";}else cout<<"No\n";}else{cout<<"No\n";}return 0;
}
C - Uniqueness
懒得说了。
15:24,A了。
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int n;
struct node{int x;int y;
}a[N];
bool cmp(node q,node p){return q.x>p.x;
}
int main(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i].x;a[i].y=i;}sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++){if(a[i-1].x!=a[i].x&&a[i+1].x!=a[i].x){cout<<a[i].y<<"\n";return 0;}}cout<<"-1\n";return 0;
}
D - Bonfire
第一眼直接暴力。
但时间似乎不对。
想到人动烟不动。
感到存不下二维。
想到用pair存坐标。
写着想到 map 没法套 pair(错的。
了结。
赛时没 A。
哭。
赛后看 tx 用 set 套 pair,之后检查 set 的长度是否发生改变。
#include<bits/stdc++.h>
using namespace std;
set<pair<int,int> > se;
int n;
int x,y,r,c;
string s;
int main(){cin>>n>>r>>c>>s;se.insert({0,0});s=" "+s;for(int i=1;i<=n;i++){if(s[i]=='N'){r++;x++;}if(s[i]=='S'){r--;x--;}if(s[i]=='E'){c--;y--;}if(s[i]=='W'){c++;y++;}se.insert({x,y});int ss=se.size();se.insert({r,c});if(se.size()==ss) cout<<'1';else{cout<<'0';se.erase({r,c});}}return 0;
}
3.29 日,了解 map 可以套 pair(大哭。
#include<iostream>
#include<map>
using namespace std;
int n,r,c;
string s;
map<pair<int,int>,int>mp;
int main(){cin>>n>>r>>c>>s;mp[make_pair(0,0)]=1;int x1=r,x2=0,y1=c,y2=0;for(int i=0;i<n;i++){if(s[i]=='N'){++x1,++x2;}else if(s[i]=='S'){--x1,--x2;}else if(s[i]=='W'){++y1,++y2;}else{--y1,--y2;}mp[make_pair(x2,y2)]=1;if(mp[make_pair(x1,y1)]==1){cout<<1;}else{cout<<"0";}}cout<<"\n";return 0;
}
E - Tree Game
交互题,没了解过,不会。
看了看题面,此题一共花了 10min(有点长)。
F - ABCBA
看到这个题,时间只有寥寥无几的三十分钟。
感觉是 KMP。
打了打,听 tx 说是马拉车。
感觉很有道理,上网现学了一下,并和了一个代码。
用 manacher 维护最长后缀回文子串。
打完了。
一直出错。
没调出来。
赛后调出来了。
愿因:i--写成了i++(大大哭。
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;string longestPalindromeSuffix(string s) {// 预处理字符串,插入特殊字符以处理偶数长度的回文串string t = "#";for (char c : s) {t += c;t += '#';}int n = t.size();vector<int> p(n, 0); // p[i] 表示以 t[i] 为中心的最长回文半径int center = 0, right = 0; // center 和 right 分别表示当前最右回文串的中心和右边界int maxLen = 0; // 最长回文后缀的长度int maxCenter = 0; // 最长回文后缀的中心for (int i = 0; i < n; ++i) {if (i < right) {p[i] = min(right - i, p[2 * center - i]); // 利用对称性}// 尝试扩展回文串while (i - p[i] - 1 >= 0 && i + p[i] + 1 < n && t[i - p[i] - 1] == t[i + p[i] + 1]) {p[i]++;}// 更新最右回文串的边界if (i + p[i] > right) {center = i;right = i + p[i];}// 如果当前回文串是后缀,并且长度大于之前的最大长度if (i + p[i] == n - 1 && p[i] > maxLen) {maxLen = p[i];maxCenter = i;}}// 提取最长回文后缀string result;for (int i = maxCenter - maxLen; i <= maxCenter + maxLen; ++i) {if (t[i] != '#') {result += t[i];}}return result;
}string s;int main() {cin >> s;cout<<s;string result = longestPalindromeSuffix(s);int t=result.size();// cout<<t<<" "<<s.size()<<"\n";for(int i=s.size()-t-1;i>=0;i--)cout<<s[i];cout<<"\n";return 0;
}
赛后听说也可以写 KMP。
于是又写了一个 KMP 代码。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int nxt[N<<1];
string s,t;
signed main() {ios_base :: sync_with_stdio(NULL);cin.tie(nullptr);cout.tie(nullptr);cin>>s;t=s;reverse(t.begin(), t.end());int n = s.size(), m = t.size();string S = t + "?" + s;for(int i = 1, j = 0 ; i < (int)(S.size()) ; ++ i) {while(j && S[i] != S[j]) j = nxt[j - 1];if(S[i] == S[j]) {nxt[i] = ++ j;if(nxt[i] == m) j = nxt[j - 1]; }}for(int i = 0 ; i < n ; ++ i)cout << s[i];for(int i = nxt[n + m] ; i < m ; ++ i)cout << t[i];return 0;
}