一道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;
}