zoukankan      html  css  js  c++  java
  • CodeForces 176B

    B. Word Cut
     

    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 wordw = 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 k splitoperations 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 test(s)
    input
    ab
    ab
    2
    output
    1
    input
    ababab
    ababab
    1
    output
    2
    input
    ab
    ba
    2
    output
    0
    Note

    The sought way in the first sample is:

    ab  →  a|b  →  ba  →  b|a  →  ab

    题意:

      给定一个串A,B,正好执行K次操作,每次操作可以把 A串从中间切开,并调换两部分的位置,问最后得到B串共有多少种不同的切法(只要中间有一次不同,即视为不同)

    题解:

    设定DP[i][0] i次操作后 是B串 的个数

      DP[i][1] i次操作后非B串的个数

      我们先找出任意由A循环(当成一个环)一个串至多能 转化成B串的数量x

      那么 从dp[i-1][0] 上一次操作的B串数量 可以再次转化成B串的数量就是  (x-1) * dp[i-1][0];那么从上一次操作由非B串转化成B串的数量是 (已经求好)  x*(dp[i-1][1]) 

      那么类似计数法 求dp[i][1] 转换到K就好了

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    #include<vector>
    using namespace std ;
    typedef long long ll;
    
    const int  N = 100000 + 10;
    const int mod = 1e9 + 7;
    ll dp[N][2]; // [i][0]经过i次转换 是B串的个数 // [i][1]经过i次转换 是原串的个数
    int main() {
        char a[N],b[N];
        int k;
        scanf("%s%s%d",a,b,&k);
        int len = strlen(a);
        ll x = 0,sum;
        for(int i = 0 ; i < len; i++) {
                sum = 0;int cnt= 0;
            for(int j = i ;j < len; j++) {
                if(a[j] != b[cnt++]) sum++;
            }
            for(int j = 0 ;j < i; j++) if(a[j] != b[cnt++]) sum++;
            if(!sum) x++;
        }
        if(strcmp(a,b) == 0) dp[0][0] = 1;
        else dp[0][1] = 1;
        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]=((len-x)*dp[i][0]+(len-x-1)*dp[i][1])%mod;
            printf("%I64d %I64d
    ",dp[i][0],dp[i][1]);
        }
        printf("%I64d
    ",dp[k][0]);
        return 0;
    }
  • 相关阅读:
    jQuery Easing 动画效果扩展--使用Easing插件,让你的动画更具美感。
    JavaScript表达式--掌握最全的表达式,一切尽在掌握中,让表达不再是难事
    JavaScript的格式--从格式做起,做最严谨的工程师
    JavaScript 简介--对javascript的初识,最基础的了解
    手机web页面制作时的注意事项
    实现像淘宝一样牛的语音搜索框
    Cufon在渲染网页字体你不知道的事
    .net中单选按钮RadioButton,RadioButtonList 以及纯Html中radio的用法实例?
    使用C#把发表的时间改为几个月,几天前,几小时前,几分钟前,或几秒前
    eval解析JSON中的注意点
  • 原文地址:https://www.cnblogs.com/zxhl/p/5148268.html
Copyright © 2011-2022 走看看