构造一个长度为n的字符串(大写字母)
n为奇数,NO
n为偶数,直接AABBAABB...
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
int n;
void solve() {
cin>>n;
if(n%2){
cout<<"NO"<<endl;
return;
}
int flag=1;
for(int i=1;i<=n;i+=2){
if(flag) cout<<"AA";
else cout<<"BB";
flag^=1;
}
cout<<endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t=1;
cin>>t;
while(t--) {
solve();
}
return 0;
}
长度为n的数组a
操作:在数组a中找一个大于等于10的元素,将其分解为一位一位的数字
操作次数不限
问能否使得数组a非降序
YES,NO
数据比较小,考虑暴力
从后往前遍历,如果前一个数比后一个数大,那么就要让前一个数分解
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=55;
int a[N];
int n;
void solve() {
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int tmp=a[n];
for(int i=n-1;i>=1;i--){
if(a[i]>tmp){//分解
string s=to_string(a[i]);
string t=s;
sort(t.begin(),t.end());
if(s!=t){
cout<<"NO"<<endl;
return;
}
if(t[(int)t.size()-1]-'0'>tmp){
cout<<"NO"<<endl;
return;
}
tmp=t[0]-'0';
}
else tmp=a[i];
}
cout<<"YES"<<endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t=1;
cin>>t;
while(t--) {
solve();
}
return 0;
}
一共两行字符串,长度均为n,由<和>组成(箭头),n为偶数
机器人初始在(1,1),每秒钟机器人完成两个动作,第一个动作是上下左右选择一个,然后随着箭头的方向走
问能否到达(2,n)
YES,NO
括号内是错误思路
(如果第二行的最后两个都是左箭头,肯定NO
记录第一行连续左箭头的区间以及第二行连续左箭头的区间,然后两行相对应的区间不能有交集(直接从小到大枚举所有区间,因为自身区间不可能有交集,所以不用分一二行),如果有,则NO
不一定是有交集 ,如果刚好补上也不行,也就是说中间没有空缺)
题目读错了,做了一个小时,做了个假题,以为是可以顺着箭头一直走,然后就认定是低配版的关鸡(2024牛客寒假训练营1的B题),但实际上只能顺着箭头走一格
然后产生了以下假代码
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
int n;
string s1,s2;
struct node{
int x,y;
bool operator<(const node &W)const{
return x<W.x;
}
};
void solve() {
cin>>n;
cin>>s1>>s2;
if(s2[n-1]=='<'&&s2[n-2]=='<'){
cout<<"NO"<<endl;
return;
}
bool ok=false;
int l,r;
vector<node>ans;
for(int i=0;i<n;i++){
if(!ok&&s1[i]=='<'){
l=i;
ok=true;
}
else if(ok&&s1[i]=='>'){
r=i-1;
if(r>l) ans.push_back({l,r});
ok=false;
}
}
if(ok&&n-1>l) ans.push_back({l,n-1});
ok=false;
for(int i=0;i<n;i++){
if(!ok&&s2[i]=='<'){
l=i;
ok=true;
}
else if(ok&&s2[i]=='>'){
r=i-1;
if(r>l) ans.push_back({l,r});
ok=false;
}
}
if(ok&&n-1>l) ans.push_back({l,n-1});
sort(ans.begin(),ans.end());
for(int i=0;i<(int)ans.size();i++) cout<<ans[i].x<<' '<<ans[i].y<<endl;
for(int i=1;i<(int)ans.size();i++){
if(ans[i].x<=ans[i-1].y+1){
cout<<"NO"<<endl;
return;
}
}
cout<<"YES"<<endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t=1;
// cin>>t;
while(t--) {
solve();
}
return 0;
}
所以读题一定要慢,一个字一个字读,读错就做假题吧
直接用bfs搜索,先上下左右走一步,再根据所在位置的箭头方向走一步,最终看是否能到达(2,n)
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
typedef pair<int,int>PII;
const int N=2e5+10;
int n;
char s[3][N];
bool vis[3][N];
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
void solve() {
cin>>n;
memset(vis,false,sizeof vis);
for(int i=1;i<=2;i++){
for(int j=1;j<=n;j++){
cin>>s[i][j];
}
}
queue<PII>q;
q.push({1,1});
vis[1][1]=true;
while(q.size()){
auto t=q.front();
int x=t.first,y=t.second;
q.pop();
for(int i=0;i<4;i++){
int tx=x+dx[i],ty=y+dy[i];
if(tx<1||tx>2||ty<1||ty>n||vis[tx][ty]) continue;
if(s[tx][ty]=='<') ty--;
else ty++;
if(tx<1||tx>2||ty<1||ty>n||vis[tx][ty]) continue;
q.push({tx,ty});
vis[tx][ty]=true;
}
}
if(vis[2][n]) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t=1;
cin>>t;
while(t--) {
solve();
}
return 0;
}
用小写字母去替换问号,使得串联重复的最长子串最长
长度n最多只有5000,双重循环暴力没问题
枚举长度len,然后check该长度是否合法(s[i]去和s[i+len]匹配,如果可以匹配就计数++,否则计数清0,看能否达到len),取最大的长度
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
string s;
void solve() {
cin>>s;
int n=s.size();
s=' '+s;
int ans=0;
for(int len=1;len<=n/2;len++){//枚举长度,即枚举答案
int cnt=0;
for(int i=1;i<=n-len;i++){
if(s[i]==s[i+len]||s[i]=='?'||s[i+len]=='?') cnt++;//记录匹配了几个
else cnt=0;
if(cnt>=len) {
ans=max(ans,len*2);
break;
}
}
}
cout<<ans<<endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t=1;
cin>>t;
while(t--) {
solve();
}
return 0;
}