疲敝,这是一个月前的场
A. XORinacci
思路:异或运算的斐波那契数列,由于异或运算的循环性,这个数列其实只是一个以三为循环节的循环数列
#include <bits/stdc++.h>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int a,b,n;
scanf("%d%d%d",&a,&b,&n);
if(n%3==0)
printf("%d\n",a);
else if(n%3==1)
printf("%d\n",b);
else if(n%3==2)
printf("%d\n",a^b);
}
return 0;
}
B. Uniqueness
思路:从已知串中去除最短子串使得剩下部分元素不重合,求最短子串长度。
事实证明暴力大法好,仅仅前后两端扫描是不够的,遍历所有可能才是正确之路
/*#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e3+5;
map<int,int> in1;
map<int,int> in2;
int a[maxn];
int main()
{
//cout << in1[0] << endl;
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
int st1=n,en1=-1,st2=n,en2=-1,len1=0,len2=0;
for(int i=0;i<n;i++)
{
if(in1[a[i]]==0)
in1[a[i]]=1;
else
{
st1 = i;
break;
}
}
for(int i=n-1;i>=0;i--)
{
if(in1[a[i]]==0)
in1[a[i]]=1;
else
{
en1 = i;
break;
}
}
if(st1<=en1)
len1 = en1-st1+1;
for(int i=n-1;i>=0;i--)
{
if(in2[a[i]]==0)
in2[a[i]]=1;
else
{
en2 = i;
break;
}
}
for(int i=0;i<n;i++)
{
if(in2[a[i]]==0)
in2[a[i]]=1;
else
{
st2 = i;
break;
}
}
if(st2<=en2)
len2 = en2-st2+1;
printf("%d\n",min(len1,len2));
return 0;
}*/
/*
该暴力时就暴力
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e3+5;
map<int,bool> in;
//map<int,int> in2;
int a[maxn];
int main()
{
/*in[5] = true;
cout << in[5] << endl;
in.clear();
cout << in[5] << endl;
cout << "***" << endl;*/
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
int p = 0;
for(;p<n;p++)
{
if(!in[a[p]])
in[a[p]]=true;
else
break;
}
//cout << p << endl;
if(p==n)
printf("0\n");
else
{
int re = 1e5;
int st,en;
for(st=0;st<p;st++)
{
in.clear();
for(int pos=0;pos<=st;pos++)
in[a[pos]] = true;
for(en=n-1;en>st;en--)
{
if(!in[a[en]])
in[a[en]]=true;
else
break;
}
//cout << en << "*" << st << endl;
re = min(re,en-st);
}
in.clear();
for(en=n-1;en>st;en--)
{
if(!in[a[en]])
in[a[en]]=true;
else
break;
}
re = min(re,en+1);
printf("%d\n",re);
}
return 0;
}
/*注意两头端点*/
/*注意初始化*/
C. Magic Grid
思路:确定各行各列的异或和相同,这就是考虑对称性的时候了.
对称性一般都会想到旋转,组成中心对称图形,但其实这种行列对称最好的思路为分块,将整体分成四块,即可确保最终的对称性
/*#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
int t = 0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n/4;j++)
{
for(int k=0;k<4;k++)
{
t++;
if(t==n)
{
t=0;
//cout << i << "*" << j << "*" << k << endl;
printf("%d\n",i*n+j*4+((k+(i%4))%4));
}
else
printf("%d ",i*n+j*4+((k+(i%4))%4));
}
}
}
return 0;
}*/
/*
旋转
对称性除了旋转还可以考虑分块
*/
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n/2;i++)
{
for(int j=0;j<n/2;j++)
{
printf("%d ",(i*n/2+j)*4);
}
for(int j=0;j<n/2;j++)
{
if(j==n/2-1)
printf("%d\n",(i*n/2+j)*4+1);
else
printf("%d ",(i*n/2+j)*4+1);
}
}
for(int i=0;i<n/2;i++)
{
for(int j=0;j<n/2;j++)
{
printf("%d ",(i*n/2+j)*4+2);
}
for(int j=0;j<n/2;j++)
{
if(j==n/2-1)
printf("%d\n",(i*n/2+j)*4+3);
else
printf("%d ",(i*n/2+j)*4+3);
}
}
return 0;
}