https://atcoder.jp/contests/arc109/tasks/arc109_c
设dp[i][k]为以s中的第i个字母开头,要连续2^k的答案
然后就好转移了,预处理出2次幂%n,然后左半部分就是dp[i][k-1],右半部分的开头就是i+2^(k-1)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=3e5+10;
int n,m,k,cnt,tot,cas,ans;
int a[maxl],mi[110];
int dp[110][110];
bool vis[maxl];
char s[maxl];
inline int dfs(int id,int k)
{
if(k==0)
{
if(s[id]=='R')
return 1;
else if(s[id]=='P')
return 2;
else if(s[id]=='S')
return 3;
}
if(dp[id][k])
return dp[id][k];
int l=dfs(id,k-1);
int r=dfs((id+mi[k-1])%n,k-1);
int x;
if(l==r)
x=l;
else
{
if(l==1)
{
if(r==2) x=2;else x=1;
}
else if(l==2)
{
if(r==1) x=2;else x=3;
}
else if(l==3)
{
if(r==1) x=1;else x=3;
}
}
dp[id][k]=x;
return x;
}
inline void prework()
{
scanf("%d%d",&n,&k);
scanf("%s",s);
mi[0]=1;
for(int i=1;i<=k;i++)
mi[i]=mi[i-1]*2%n;
int op=dfs(0,k);
if(op==1)
puts("R");
else if(op==2)
puts("P");
else
puts("S");
}
inline void mainwork()
{
}
inline void print()
{
}
int main()
{
int t=1;
//scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}
本文针对AtCoder竞赛ARC109中的C题提供了详细的解答思路及代码实现。通过动态规划的方法解决了字符串匹配问题,实现了高效的答案计算。
3644

被折叠的 条评论
为什么被折叠?



