T1:
穴の大きな脳のタイトルは、うまくすべてのXORの出力までの数を入力します。
(私はXORああを使用したい理由を言います)
#include <ビット/ STDC ++ H> 使用して名前空間STDを、 インラインint型リード(){ int型 ANS = 0 。 チャー最後= ' '、CH = GETCHAR()。 一方、(CH> ' 9 ' || CH < ' 0 ')最後= CH、CH = GETCHAR()。 一方、(CH> = ' 0 ' && CH <= ' 9 ')ANS =(ANS << 1)+(ANS << 3)+ CH- ' 0 '、CH = GETCHAR()。 もし (最後== ' - ')ANS = - ANS。 戻るANSを。 } int型N、C。 int型ANS; INT (){メイン N = 読み取ります()。 以下のために(int型 i = 1 ; iが<= N; iは++ ){ C = )(読み取ります。 ANS ^ = C; } のprintf(" %dの" 、ANS)。 リターン 0 ; }
T2:
結論質問:文字列の長さがダウン単なる文字列のみについて2つのエンドポイントを決定し、その最初の行3 ^ K + 1つの値から、3 ^ K + 1であることを起こります。
#include<bits/stdc++.h> using namespace std; inline int read() { int ans=0; char last=' ',ch=getchar(); while(ch>'9'||ch<'0') last=ch,ch=getchar(); while(ch>='0'&&ch<='9') ans=(ans<<1)+(ans<<3)+ch-'0',ch=getchar(); if(last=='-') ans=-ans; return ans; } int n,l; char a[10000010]; int three[15]= {2,4,10,28,82,244,730,2188,6562,19684,59050,177148,531442,1594324,4782970}; int main() { n=read(); scanf("%s",a+1); int len=strlen(a+1); while(len>0) { for(int i=14; i>=0; i--) if(three[i]<=len) { l=three[i]; break; } for(int i=1; i<=len-l+1; i++) { if(a[i]==a[i+l-1]) continue; if(a[i]=='B'&&a[i+l-1]=='G') { a[i]='R'; continue; } if(a[i]=='B'&&a[i+l-1]=='R') { a[i]='G'; continue; } if(a[i]=='G'&&a[i+l-1]=='B') { a[i]='R'; continue; } if(a[i]=='G'&&a[i+l-1]=='R') { a[i]='B'; continue; } if(a[i]=='R'&&a[i+l-1]=='B') { a[i]='G'; continue; } if(a[i]=='R'&&a[i+l-1]=='G') { a[i]='B'; continue; } } len=len-l+1; } printf("%c",a[1]); }
然后还有一个暴力骗分的方法,只能得到30pts,但在找不出规律时也不失为一种策略(当然tle的部分你可以随便输出‘R’,‘G’,‘B’中的任意一个,应该也可以骗到不少分);
#include<bits/stdc++.h> using namespace std; inline int read() { int ans=0; char last=' ',ch=getchar(); while(ch>'9'||ch<'0') last=ch,ch=getchar(); while(ch>='0'&&ch<='9') ans=(ans<<1)+(ans<<3)+ch-'0',ch=getchar(); if(last=='-') ans=-ans; return ans; } int n; char a[10000010]; int main() { n=read(); scanf("%s",a+1); int len=strlen(a+1); while(len>4) { for(int i=1; i<=len-3; i++) { if(a[i]==a[i+3]) continue; if(a[i]=='B'&&a[i+3]=='G') { a[i]='R'; continue; } if(a[i]=='B'&&a[i+3]=='R') { a[i]='G'; continue; } if(a[i]=='G'&&a[i+3]=='B') { a[i]='R'; continue; } if(a[i]=='G'&&a[i+3]=='R') { a[i]='B'; continue; } if(a[i]=='R'&&a[i+3]=='B') { a[i]='G'; continue; } if(a[i]=='R'&&a[i+3]=='G') { a[i]='B'; continue; } } len-=3; } if(len==4) { if(a[1]==a[4]) printf("%c",a[1]); if(a[1]=='B'&&a[4]=='G') printf("R"); if(a[1]=='B'&&a[4]=='R') printf("G"); if(a[1]=='G'&&a[4]=='B') printf("R"); if(a[1]=='G'&&a[4]=='R') printf("B"); if(a[1]=='R'&&a[4]=='B') printf("G"); if(a[1]=='R'&&a[4]=='G') printf("B"); return 0; } while(len) { for(int i=1; i<=len-1; i++) { if(a[i]==a[i+1]) continue; if(a[i]=='B'&&a[i+1]=='G') { a[i]='R'; continue; } if(a[i]=='B'&&a[i+1]=='R') { a[i]='G'; continue; } if(a[i]=='G'&&a[i+1]=='B') { a[i]='R'; continue; } if(a[i]=='G'&&a[i+1]=='R') { a[i]='B'; continue; } if(a[i]=='R'&&a[i+1]=='B') { a[i]='G'; continue; } if(a[i]=='R'&&a[i+1]=='G') { a[i]='B'; continue; } } len--; } printf("%c",a[1]); return 0; }