一道cf的dp题,也挺好的,虽然没牛客难..牛客还是牛/..
这题是可以选择单词断开然后连起来,类似环.
考虑dp,令dp[0][i]为操作i次是原串的方案数,dp[1][i]为操作i次是其他串的方案数.
然后显然就有两个dp方程.
dp[0][i]=dp[1][i-1]*(n-1). dp[1][i]=dp[0][i-1]+dp[1][i-1]*(n-2).
然后比较下两个串,对第二个串看成环进行考虑,假如开始相同就是+dp[0][k],不然就是+dp[1][k].
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+5;
const int mod=1e9+7;
typedef long long ll;
ll dp[N][N],ans=0;
int main()
{
string s,t;
cin>>s>>t;
int n=s.size();
int k;
scanf("%d",&k);
dp[0][0]=1;
dp[1][0]=0;
for(int i=1;i<=k;i++)
{
dp[0][i]=dp[1][i-1]*(n-1)%mod;
dp[1][i]=(dp[0][i-1]+dp[1][i-1]*(n-2))%mod;
}
bool flag;
for(int i=0;i<n;i++)//设偏移多少.
{
flag=true;
for(int j=0;j<n;j++)
{
if(s[(i+j)%n]!=t[j]) flag=0;
}
if(flag)
{
if(i==0) ans+=dp[0][k];
else ans+=dp[1][k];
ans%=mod;
}
}
cout<<ans<<endl;
return 0;
}

京公网安备 11010502036488号