zoukankan      html  css  js  c++  java
  • CodeForces 176B Word Cut dp

    Word Cut

    题目连接:

    http://codeforces.com/problemset/problem/176/C

    Description

    Let's consider one interesting word game. In this game you should transform one word into another through special operations.

    Let's say we have word w, let's split this word into two non-empty parts x and y so, that w = xy. A split operation is transforming word w = xy into word u = yx. For example, a split operation can transform word "wordcut" into word "cutword".

    You are given two words start and end. Count in how many ways we can transform word start into word end, if we apply exactly ksplit operations consecutively to word start.

    Two ways are considered different if the sequences of applied operations differ. Two operation sequences are different if exists such number i (1 ≤ i ≤ k), that in the i-th operation of the first sequence the word splits into parts x and y, in the i-th operation of the second sequence the word splits into parts a and b, and additionally x ≠ a holds.

    Input

    The first line contains a non-empty word start, the second line contains a non-empty word end. The words consist of lowercase Latin letters. The number of letters in word start equals the number of letters in word end and is at least 2 and doesn't exceed 1000 letters.

    The third line contains integer k (0 ≤ k ≤ 105) — the required number of operations.

    Output

    Print a single number — the answer to the problem. As this number can be rather large, print it modulo 1000000007(109 + 7).

    Sample Input

    ab

    ab

    2

    Sample Output

    1

    Hint

    题意

    给你一个字符串a,然后给你一个字符串b

    你可以选择a串的某个位置砍掉,然后再把那个串从后面接到前面

    让你砍k次,问你有多少种砍法,从a串砍成b串

    题解:

    dp

    dp[i][0]表示砍了i次的变成b串的方案数

    dp[i][1]表示砍了i次的变成非b串的方案数

    然后转移就好了,预处理一下有多少个开头是b串的

    然后转转就好了

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int mod = 1e9+7;
    long long dp[300000][2];
    string a,b;
    int k;
    int main()
    {
        cin>>a>>b;
        scanf("%d",&k);
        if(a==b)dp[0][0]=1;
        else dp[0][1]=1;
        int x = 0;
        for(int i=0;i<a.size();i++)
        {
            int flag = 1;
            for(int j=0;j<a.size();j++)
            {
                if(a[(i+j)%a.size()]!=b[j])
                {
                    flag = 0;
                    break;
                }
            }
            if(flag)x++;
        }
        for(int i=0;i<k;i++)
        {
            dp[i+1][0]=(x*dp[i][1]+(x-1)*dp[i][0])%mod;
            dp[i+1][1]=((a.size()-x)*dp[i][0]+(a.size()-x-1)*dp[i][1])%mod;
        }
        printf("%d
    ",dp[k][0]);
    }
  • 相关阅读:
    12.9Java日报
    2020-12-10日报博客-周四
    2020-12-9日报博客-周三
    2020-12-8日报博客-周二
    2020-12-7日报博客-周一
    2020-12-6日报博客-一周总结
    2020-12-4日报博客-周五
    .NET ------ 界面显示优化(新增,查询窗口)
    构建之法阅读笔记——程序员篇
    Eclipse的Junit单元测试
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5146877.html
Copyright © 2011-2022 走看看