A Special Characters
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+10;
void solve(){
int n;
cin>>n;
if(n&1){cout<<"NO\n";return ;}
cout<<"YES\n";
for(int i=0;i<n/2;i++){char c=i+'A';cout<<c<<c;}
cout<<endl;
}
int main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int t;
cin>>t;
//t=1;
while(t--)solve();
return 0;
}
特殊字符:与1个相同字符相邻
由对称性可知,不存在有奇数个特殊字符的字符串。
按AABBCCDD...输出即可
B Array Fix
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+10;
int n,a[N];
void solve(){
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=n-2;i>=0;i--){
if(a[i]>a[i+1]){
int a1=a[i]/10,a2=a[i]%10;
if(a1<=a2 && a2<=a[i+1]) a[i]=a1;
else{cout<<"NO\n";return ;}
}
}
cout<<"YES\n";
return ;
}
int main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int t;
cin>>t;
//t=1;
while(t--)solve();
return 0;
}
不降序列:小等于
易知,最后一个数不会拆。
逆序遍历数组,遇到an>an+1,判断an拆开后是否满足不降,满足则令an/=10
C Arrow Path
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+10;
int n,a[3][N],vis[3][N],flag;
char c;
int go[4][2]={1,0,0,1,-1,0,0,-1};
void dfs(int x,int y){
vis[x][y]=1;
for(int k=0;k<4;k++){
int nx=x+go[k][0],ny=y+go[k][1];
if(!(nx>0&&nx<=2&&ny>0&&ny<=n))continue;
ny+=a[nx][ny];
if(vis[nx][ny])continue;
dfs(nx,ny);
}
}
void solve(){
cin>>n;
flag=0;
for(int i=1;i<=n;i++)vis[1][i]=0,vis[2][i]=0;//不要再用memset啦!!!
for(int i=1;i<=n;i++){cin>>c;a[1][i]=c=='>'?1:-1;}
for(int i=1;i<=n;i++){cin>>c;a[2][i]=c=='>'?1:-1;}
dfs(1,1);
if(vis[2][n]){cout<<"YES\n";return ;}
else {cout<<"NO\n";return ;}
}
int main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int t;
cin>>t;
//t=1;
while(t--)solve();
return 0;
}
dfs板子题,注意剪枝
❗不要使用memset,会ttttttt!利用循环初始化
D Tandem Repeats?
#include<bits/stdc++.h>
using namespace std;
void solve(){
string s;
cin>>s;
int ans=0;
for(int len=s.length()/2;len>0;len--){
int cnt=0;
for(int i=0;i+len<s.length();i++){
if(s[i]==s[i+len]||s[i]=='?'||s[i+len]=='?'){
cnt++;
if(cnt==len){ans=max(ans,cnt*2);break;}
}
else cnt=0;
}
}
cout<<ans<<endl;
}
int main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int t;
cin>>t;
//t=1;
while(t--)solve();
return 0;
}
枚举长度+遍历起点
ps:第一次写了O(n^3),双指针起点终点+while匹配字符串 t....然后想到记忆化....想了一下放弃了,于是去看了下大佬的题解...