A
对于一个字符串,如果长度大于等于3,那么必然存在回文子串。
如果长度是2,如果两个字母相同,就存在回文子串。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl '\n'
const int mod=998244353;
const int N= 500100;
void solve(){
string s;
int n;
cin>>n>>s;
if(n==1) {
cout<<"YES"<<endl;
return ;
}
else if(n==2&&s[0]!=s[1]){
cout<<"YES"<<endl;
return ;
}
cout<<"NO"<<endl;
return ;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
B
本题的结论是:
对于某个输入n,最终的结果一定是小于n的2的最大幂。
设这个数为x
首先输出n-1~x,再输出0,最后输出x-1 ~1。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl '\n'
const int mod=998244353;
const int N= 200100;
int vis[N];
void solve(){
int n;
cin>>n;
int x=1;
while(x*2<=n-1) x*=2;
for( int i=n-1;i>=x;i--){
cout<<i<<" ";
}
cout<<0<<" ";
for( int i=x-1;i>=1;i--){
cout<<i<<" ";
}
cout<<endl;
}
int main(){
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
C
推公式
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl '\n'
const int N= 200100;
const int inf=0x3f3f3f3f;
int solve(){
int a,b;
cin>>a>>b;
int res=b-a;
for( int i=a;i<=b;i++){
int b1=0;
for( int j=20;j>=0;j--){
if((b>>j)&1){
b1=b1|(1<<j);
}
else {
if((i>>j)&1){
b1=b1|(1<<j);
break;
}
}
}
res = min(res, i - a - b + (i | b1) + 1);
}
return res;
}
int main(){
int t;
cin>>t;
while(t--){
cout<<solve()<<endl;
}
return 0;
}
D
ST表和二分
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl '\n'
const int N= 200100;
const int inf=0x3f3f3f3f;
int a[N];
int ans[N];
int bin[20],Log[N];
int st_gcd[N][20];
void init(){
bin[0]=1;
for( int i=1;i<20;i++) bin[i]=bin[i-1]*2;
Log[0]=-1;
for( int i=1;i<N;i++) Log[i]=Log[i/2]+1;
}
int get_gcd(int l,int r){
int t=Log[r-l+1];
return __gcd(st_gcd[l][t],st_gcd[r-bin[t]+1][t]);
}
int get_pos( int l,int r,int val){
int rr=r;
while(l<r){
int mid=(l+r)>>1;
if(get_gcd(mid,rr)>=val) r=mid;
else l=mid+1;
}
return l;
}
int solve(){
int n;
cin>>n;
for( int i=1;i<=n;i++){
cin>>a[i];
}
for( int i=1;i<=n;i++) st_gcd[i][0]=a[i];
for( int i=1;i<=Log[n];i++){
for( int j=1;j<=n;j++)
if(j+bin[i]-1<=n){
st_gcd[j][i]=__gcd(st_gcd[j][i-1],st_gcd[j+bin[i-1]][i-1]);
}
}
int pre=0;
for( int i=1;i<=n;i++){
int r=i,l=pre+1;
int cur=a[i],pos=i;
while(pos>=l){
int len1=r-pos+1;
pos=max(get_pos(l,r,cur),l);
int len2=r-pos+1;
if(cur>=len1&&cur<=len2) {
ans[i]=1;
pre=i;
break;
}
pos--;
cur=get_gcd(pos,i);
}
}
for( int i=1;i<=n;i++){
ans[i]+=ans[i-1];
cout<<ans[i]<<" ";
}
}
int main(){
init();
solve();
return 0;
}