线性基https://www.cnblogs.com/vb4896/p/6149022.html
取向量组中的两个向量a,b,把a,b中的某一个替换成a xor b, 替换前后向量组中的向量的线性组合得到的空间相同。 通俗的说就是 替换前后 能异或出来的值一样。
11.12训练题目https://vjudge.net/contest/269827
11.12E let the ballon rise
注意map的应用,mp[s[i]]+=1,这个很巧妙
#include <iostream>
#include<string>
#include<map>
using namespace std;
const int maxn=1005;
int main() {
int N;
while(cin>>N&&N)
{
string s[maxn];
int n=0;
map<string,int> mp;
for(int i=0;i<N;i++)
{
cin>>s[i];
mp[s[i]]+=1;
}
int maxv=0;
for(map<string,int>::iterator it=mp.begin();it!=mp.end();it++)
{
if(maxv<it->second)
maxv=it->second;
}
for(map<string,int>::iterator cmp=mp.begin();cmp!=mp.end();cmp++)
{
if(cmp->second==maxv)
{
cout<<cmp->first<<endl;
break;
}
}
}
return 0;
}
11.12D 求最长连续子序列,并找到开始位置和最后位置
注意:如果两个输出结果之间有换行,可先再while循环外定义一个flag=0;然后在while循环中if(flag) cout<<endl; flag++;
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=100010;
int main()
{
int t=0;
int n;
cin>>n;
while(n--)
{
if(t)
cout<<endl;
t++;
int t1;
cin>>t1;
int a[maxn];
for(int i=1;i<=t1;i++)
{
cin>>a[i];
}
int manx=a[1],ii=1,jj=1,ans=1;
for(int j=2;j<=t1;j++)
{
if(a[j-1]>=0)
a[j]=a[j-1]+a[j];
else
ans=j;
if(a[j]>manx)
{
manx=a[j];
ii=ans;
jj=j;
}
}
cout<<"Case "<<t<<":"<<endl;
cout<<manx<<" "<<ii<<" "<<jj<<endl;
}
return 0;
}
11.12E 矩阵快速幂板子
#include<bits/stdc++.h>
using namespace std;
#define mod 7
#define ll long long
int n=2; //方阵的行列数
struct Matrix
{
ll m[105][105]; //矩阵结构体
};
Matrix operator*(Matrix a,Matrix b) //模拟矩阵乘法
{
Matrix c;
memset(c.m,0,sizeof(c.m));
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
for(int k=1; k<=n; k++)
c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j]+mod)%mod;
return c;
}
Matrix operator^(Matrix a,int b) //快速幂 矩阵a的b次方
{
Matrix c;
memset(c.m,0,sizeof(c.m));
for(int i=1; i<=n; i++) //初始化为单位矩阵
c.m[i][i]=1;
while(b)
{
if(b&1)
c=c*a; //快速幂
a=a*a;
b>>=1;
}
return c;
}
int main()
{
int a,b,c;
std::ios::sync_with_stdio(false);
while(cin>>a>>b>>c)
{
if(!a) break;
if(c<3)
cout<<1<<endl;
else
{
Matrix M;
M.m[1][1]=a,M.m[1][2]=b,M.m[2][1]=1,M.m[2][2]=0;
Matrix ans=M^(c-2);
cout<<(ans.m[1][1]+ans.m[1][2])%mod<<endl;
}
}
return 0;
}
11.16训练题https://vjudge.net/contest/270251#status
C题(求假币):容易考虑不全面,花了我一天多的时间,能找到不同类型的样例很重要,这样来修改错误
/*Sample Input
1
ABCD EFGH even
ABCI EFJK up
ABIJ EFGH even
Sample Output
K is the counterfeit coin and it is light. */
#include <iostream>
#include<string>
#include<map>
using namespace std;
string a="ABCDEFGHIJKL";
map<char,int> ans,cns,bns;
int main()
{
int T;
cin>>T;
while(T--)
{
for(int k=0;k<(int)a.length();k++)
{
ans[a[k]]=1;
cns[a[k]]=0;
bns[a[k]]=0;
}
for(int i=0;i<3;i++)
{
string s1,s2,s3;
cin>>s1>>s2>>s3;
if(s3=="even")
{
for(int j=0;j<(int)s1.length();j++)
{
ans[s1[j]]=0;
ans[s2[j]]=0;
}
}
else if(s3=="up")
{
for(int j=0;j<(int)s1.length();j++)
{
if(ans[s1[j]]==0)
j++;
else
{
ans[s1[j]]=1;
cns[s1[j]]+=1;
bns[s1[j]]+=1;
}
}
for(int j=0;j<(int)s2.length();j++)
{
if(ans[s2[j]]==0)
j++;
else
{
ans[s2[j]]=1;
cns[s2[j]]-=1;
bns[s2[j]]+=1;
}
}
}
else if(s3=="down")
{
for(int j=0;j<(int)s1.length();j++)
{
if(ans[s1[j]]==0)
j++;
else
{
ans[s1[j]]=1;
cns[s1[j]]-=1;
bns[s1[j]]+=1;
}
}
for(int j=0;j<(int)s2.length();j++)
{
if(ans[s2[j]]==0)
j++;
else
{
ans[s2[j]]=1;
cns[s2[j]]+=1;
bns[s2[j]]+=1;
}
}
}
}
int maxx=0;
for(int t=0;t<(int)a.length();t++)
{
if(maxx<bns[a[t]])
maxx=bns[a[t]];
}
int m=0-maxx;
for(int t=0;t<(int)a.length();t++)
{
if(ans[a[t]]==1&&cns[a[t]]==m&&maxx==bns[a[t]])
{
cout<<a[t]<<" is the counterfeit coin and it is light."<<endl;
break;
}
else if(ans[a[t]]==1&&cns[a[t]]==maxx&&maxx==bns[a[t]])
{
cout<<a[t]<<" is the counterfeit coin and it is heavy."<<endl;
break;
}
}
}
return 0;
}