链接
https://atcoder.jp/contests/abc195/tasks/abc195_e
题意
字符串 S S S 只包含数字,字符串 X X X 只包含 A
和 T
,字符串 T 是空串。
当 X i X_i Xi 为 A
时,Aoki 操作,否则 Takahashi 操作。
每次操作可将 0 0 0 或 S i S_i Si 放在 T T T 末尾。
如果 T T T 是 7 7 7 的倍数则 Takahashi 获胜,否则 Aoki 获胜。
思路
回合编号从 0 0 0 开始,总共 n n n 个回合。
记 d p i , j dp_{i,j} dpi,j 为当前为第 i i i 个回合,该回合之前余数为 j j j 时 Takahashi 是否能获胜。
若Takahashi 获胜, d p n , 0 = 1 dp_{n,0}=1 dpn,0=1,然后进行倒推:
- X i = X_i= Xi=
T
, d p i , j = d p i + 1 , ( j ∗ 10 + s i ) % 7 ∣ d p i + 1 , j ∗ 10 % 7 dp_{i,j}=dp_{i+1,(j*10+s_i)\%7}|dp_{i+1,j*10\%7} dpi,j=dpi+1,(j∗10+si)%7∣dpi+1,j∗10%7
当前为第 i i i 回合且 Takahashi 操作,两种放置中有一种 Takahashi 能获胜即可。 - X i = X_i= Xi=
A
, d p i , j = d p i + 1 , ( j ∗ 10 + s i ) % 7 & d p i + 1 , j ∗ 10 % 7 dp_{i,j}=dp_{i+1,(j*10+s_i)\%7}\&dp_{i+1,j*10\%7} dpi,j=dpi+1,(j∗10+si)%7&dpi+1,j∗10%7
当前为第 i i i 回合且 Aoki 操作,必须保证两种放置后 Takahashi 都能获胜。
最后只要判断 d p 0 , 0 dp_{0,0} dp0,0 是否为 1 1 1。
代码
#include <bits/stdc++.h>
#define SZ(x) (int)(x).size()
#define ALL(x) (x).begin(),(x).end()
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define FI first
#define SE second
using namespace std;
typedef double DB;
typedef long double LD;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef vector<PII> VPII;
// head
const int N=2e5+5;
int n,dp[N][7];
string s,x;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n>>s>>x;
dp[n][0]=1;
for(int i=n-1;~i;i--) {
for(int j=0;j<7;j++) {
int a=dp[i+1][(j*3+s[i]-'0')%7],b=dp[i+1][j*3%7];
if(x[i]=='T') dp[i][j]=a|b;
else dp[i][j]=a&b;
}
}
cout<<(dp[0][0]?"Takahashi":"Aoki")<<'\n';
return 0;
}
今天的文章AtCoder Beginner Contest 195 E. Lucky 7 Battle[通俗易懂]分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/63987.html