T1 Kalevitch and Chess
统计只有B的行数和列数即可
特判全是B的情况
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using db = double;
const int N = 255;
char s[10][10];
int main(){
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
cin>>s[i][j];
int c1=0,c2=0;
for(int i=0;i<8;i++){
bool f1=0,f2=0;
for(int j=0;j<8;j++){
if(s[i][j]=='W') f1=1;
if(s[j][i]=='W') f2=1;
}
if(!f1) c1++;
if(!f2) c2++;
}
if(c1==8 || c2==8) puts("8");
else printf("%d\n",c1+c2);
}
T2 Memory Manager
题目
恶心模拟题
可以将n的范围变为
n
<
=
1
e
5
n<=1e5
n<=1e5,使这题更加恶心
#include<bits/stdc++.h>
using namespace std;
const int N=105;
char s[10];
struct node{ int s,l,id; }p[N];
int t,m,cnt,mark[N];
bool cmp(node x,node y) { return x.s<y.s; }
void alloc()
{
int n,le=1,flag=0;
scanf("%d",&n);
if(n>m) { printf("NULL\n"); return; }
for(int i=1;i<=cnt;i++)
{
if(!mark[p[i].id]) continue;
flag=1;
if(p[i].s-le>=n)
{
p[++cnt]={le,n,cnt};
printf("%d\n",cnt);
mark[cnt]=1;
sort(p+1,p+1+cnt,cmp);
return;
}
else le=p[i].s+p[i].l;
}
if(!flag || m-le+1>=n)
{
p[++cnt]={le,n,cnt};
printf("%d\n",cnt);
mark[cnt]=1;
sort(p+1,p+1+cnt,cmp);
return;
}
else printf("NULL\n");
return;
}
//在内存中分配n字节的空间。此命令将返回已分配的内存块的编号
void erase()
{
int x;
scanf("%d",&x);
if(x<=0 || x>100) { printf("ILLEGAL_ERASE_ARGUMENT\n"); return; }
if(!mark[x]) { printf("ILLEGAL_ERASE_ARGUMENT\n"); return; }
else mark[x]=0;
return;
}
//释放编号为x的内存块
void defragment()
{
int le=1;
for(int i=1;i<=cnt;i++)
{
if(!mark[p[i].id]) continue;
p[i]={le,p[i].l,p[i].id};
le+=p[i].l;
}
return;
}
//将所有内存块全部向内存的起点靠拢并且不改变它们的顺序
int main()
{
scanf("%d %d",&t,&m);
for(int i=1;i<=t;i++)
{
scanf("%s",s+1);
if(s[1]=='a') alloc();
else if(s[1]=='e') erase();
else if(s[1]=='d') defragment();
}
return 0;
}
T3 Line
题目
用来练
e
x
g
c
d
exgcd
exgcd板子还不错
会裴蜀定理就行
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using db = double;
const int N = 255;
ll x,y;
ll exgcd(ll a,ll b,ll &xx,ll &yy){
if(!b){
xx=1,yy=0;
return a;
}
ll res=exgcd(b,a%b,xx,yy);
ll t=xx;
xx=yy,yy=t-(a/b)*yy;
return res;
}
int main(){
ll A,B,C;
scanf("%lld%lld%lld",&A,&B,&C);
ll g=exgcd(A,B,x,y);
if(C%g) puts("-1");
else {
ll t=-(C/g);
printf("%lld %lld\n",x*t,y*t);
}
}
T4 Palindrome Degree
考虑
D
P
DP
DP,
f
i
f_i
fi表示前
i
i
i个字符组成的前缀的阶级
那么
a
n
s
=
∑
i
=
1
n
f
i
ans=\sum_{i=1}^n f_i
ans=∑i=1nfi,
考虑转移
f
i
=
{
0
(
不为回文串
)
f
i
/
2
(为回文串)
f_i = \begin{cases} 0 \quad(不为回文串)\\ f_{i/2}(为回文串) \\ \end{cases}
fi={0(不为回文串)fi/2(为回文串)
所以关键在于回文串的判断,可以
H
a
s
h
Hash
Hash
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 5e6+7;
int n,len;
ll pre,ba,fa=1,f[N];
char s[N];
int main(){
scanf("%s",s+1);
int len=strlen(s+1);
for(int i=1;i<=len;i++){
pre=pre*17+ll(s[i]),ba=ba+fa*ll(s[i]),fa=fa*17;
if(pre==ba){
f[i]=f[(i/2)]+1;
}else{
f[i]=0;
}
}
ll ans=0;
for(int i=1;i<=len;i++) ans+=f[i];
printf("%lld\n",ans);
}
T5 Defining Macros
题目
毒瘤模拟题,谁做谁上吊
毒瘤模拟题,谁做谁上吊
毒瘤模拟题,谁做谁上吊
#include<bits/stdc++.h>
using namespace std;
map<string,int> mp;
string s2;
string s3;
int judge(string s,int l,int r){
int add=0,x,y,f=0;
string ss;
for(int i=r;i>=l;i--){
if(s[i]=='(')
add++;
else if(s[i]==')')
add--;
else if(add==0&&f==0&&(s[i]=='*'||s[i]=='/'))
f=i;
else if(add==0&&(s[i]=='+'||s[i]=='-'))
{
x=judge(s,l,i-1);
y=judge(s,i+1,r);
if(x==2||y==2)
return 2;
if(s[i]=='+')
return 3;
else if(s[i]=='-')
{
if(y==3)
return 2;
else return 3;
}
}
}
if(f!=0)
{
x=judge(s,l,f-1);
y=judge(s,f+1,r);
if(x==2||y==2)
return 2;
if(s[f]=='*')
{
if(x==3||y==3)
return 2;
else return 4;
}
else if(s[f]=='/')
{
if(x==3||y==3||y==4)
return 2;
else return 4;
}
}
else if(s[l]=='('&&s[r]==')')
{
if(judge(s,l+1,r-1)==2)
return 2;
else return 1;
}
else{
ss="";
for(int i=l;i<=r;i++)
ss+=s[i];
if(mp[ss]!=0)
return mp[ss];
else return 1;
}
}
int main(){
int n;
string s;
cin>>n;
for(int i=0;i<n;i++){
cin>>s;
if(s[s.size()-1]=='#') cin>>s;
cin>>s;
getline(cin,s2);
s3="";
for(int j=0;j<s2.size();j++)
if(s2[j]!=' ')
s3+=s2[j];
mp[s]=judge(s3,0,s3.size()-1);
}
getline(cin,s2);
s3="";
for(int j=0;j<s2.size();j++)
if(s2[j]!=' ')
s3+=s2[j];
if(judge(s3,0,s3.size()-1)!=2)
cout<<"OK"<<endl;
else cout<<"Suspicious"<<endl;
return 0;
}