2021/11/21 ICPC沈阳站个人题解B,E,F,J(附赛时记录,另附赛后补题代码I,M)
Posted 工口发动机
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021/11/21 ICPC沈阳站个人题解B,E,F,J(附赛时记录,另附赛后补题代码I,M)相关的知识,希望对你有一定的参考价值。
E.Edward Gaming, the Champion
题目大意:给定一个全是小写字符的字符串,找出有几个为 edgnb 的字串。
题解:暴力模拟即可。
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m,ans;
void solve()
string s;
cin>>s;
string sr="edgnb";
for(int i=0;i+5<=s.size();i++)
int flag=1;
for(int j=0;j<5;j++)
if(s[i+j]!=sr[j]) flag=0;
if(flag) ans++;
cout<<ans;
signed main()
int t=1;
//cin>>t;
while(t--)
solve();
F.Encoded Strings I
队友写的,先放个代码,等队友写题解
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
string s;
int f[N];
set <char> se;
int vis[N];
void change(int len)
se.clear();
for(int i=len;i>=0;i--)
if(se.count(s[i])==0) f[s[i]-'a']=se.size();
se.insert(s[i]);
string sr[N];
char son[33]='a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z';
signed main()
int n;
cin>>n;
cin>>s;
for(int i=1;i<=n;i++)
change(i-1);
for(int j=0;j<i;j++)
sr[i]+=son[f[s[j]-'a']];
//cout<<f[s[j]-'a']<<' ';
//cout<<endl;
sort(sr+1,sr+1+n);
cout<<sr[n]<<endl;
J.Luggage Lock
题目大意:有一个锁,起始状态是 a 0 a_0 a0, a 1 a_1 a1, a 2 a_2 a2, a 3 a_3 a3 ,每次只能将相邻的几个位进行顺时针旋转一次或逆时针旋转一次,请问移动到 b 0 b_0 b0, b 1 b_1 b1, b 2 b_2 b2, b 3 b_3 b3 最少需要几步。
题解:
首先,容易观察到将
a
0
a_0
a0,
a
1
a_1
a1,
a
2
a_2
a2,
a
3
a_3
a3 转到 0,0,0,0,状态,并将
b
0
b_0
b0,
b
1
b_1
b1,
b
2
b_2
b2,
b
3
b_3
b3 进行与上相同操作后得到了
c
0
c_0
c0,
c
1
c_1
c1,
c
2
c_2
c2,
c
3
c_3
c3 再将
c
0
c_0
c0,
c
1
c_1
c1,
c
2
c_2
c2,
c
3
c_3
c3转至 0,0,0,0,所需要的步数即为答案。
发现所有的答案不超过10000种,对于每次输入的a与b,我们都可以计算出
c
0
c_0
c0,
c
1
c_1
c1,
c
2
c_2
c2,
c
3
c_3
c3 =
b
0
b_0
b0,
b
1
b_1
b1,
b
2
b_2
b2,
b
3
b_3
b3 -
a
0
a_0
a0,
a
1
a_1
a1,
a
2
a_2
a2,
a
3
a_3
a3并得到ans【
c
0
c_0
c0,
c
1
c_1
c1,
c
2
c_2
c2,
c
3
c_3
c3】
所以我们只需要预处理出至多10000组答案即可。
其次考虑预处理ans数组,容易分析得到任何时候可选择连续区间只有10种,且同一区间选择至多在同一方向旋转9次。于是便对每种区间选择考虑同方向旋转1-9次(旋转6,7,8,9次即可当作反向旋转4,3,2,1次)。
随后便可从0,0,0,0开始通过bfs处理所有ans。
代码实现:
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m,t;
int u,v,w;
int ans[10005];
struct node
int a,b,c,d;
node operator +(node t)
return (a+t.a)%10,(b+t.b)%10,(c+t.c)%10,(d+t.d)%10;
node operator *(int t)
return t*a,t*b,t*c,t*d;
node operator - (node t)
return (a+10-t.a)%10,(b+10-t.b)%10,(c+10-t.c)%10,(d+10-t.d)%10;
a[10005];
node p1[20];
node f(int x)
int a,b,c,d;
d=x%10;x/=10;
c=x%10;x/=10;
b=x%10;a=x/10;
return a,b,c,d;
queue<int> q;
int f1(node t)return t.a*1000+t.b*100+t.c*10+t.d;
int geti(int x,int y,int z)
node t=f(x)+p1[y]*z;
return f1(t);
void solve()
int l,r;
cin>>l>>r;
node ll=f(l),rr=f(r);
cout<<ans[f1(rr-ll)]<<"\\n";
signed main()
int p[20]=0,1,11,111,1111,10,以上是关于2021/11/21 ICPC沈阳站个人题解B,E,F,J(附赛时记录,另附赛后补题代码I,M)的主要内容,如果未能解决你的问题,请参考以下文章