题意:

给你两个串s1,s2和一个K,

有一种操作是在一个串切开然后交换位置,

问s1有多少种方法经过K次这样的操作变成s2;

思路:

(从来没接触过计数DP...还是太菜...参考了【大牛blog

首先呢,不管怎么切怎么换,都是原串自己转来转去有没有???看到这个其实我还是不懂。。。。

然后呢,我们搞一个DP数组记下数,纯粹就是计数的;

dp[now][0]代表到第i步变成原串的方案数;

dp[now][1]代表到第i步变成非原串的方案数;

从哪里变成原串啊?一个原串可以变成len-1个非原串,那么len-1个非原串也能变成1个原串咯

从哪里变成非原串?本来原串能变成len-1个非原串,而每个非原串又能变成1个原串,还能变成len-2个跟他也不同的串;

so...

dp[now][0]=dp[last][1]*(len-1);

dp[now][1]=dp[last][0]+dp[last][1]*(len-2);

最后只要枚举一下环,有没有哪个位置开始起和目标串一样,然后加上方案就好了;

牛逼啊;

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int>PII;
const double eps=1e-5;
const double pi=acos(-1.0);
const int INF=0x3f3f3f3f; const int mod=1e9+7;
const int N=1e3+10;
char s1[N],s2[N];
int k; LL dp[2][2]; int main()
{
int len;
scanf("%s%s%d",s1,s2,&k);
len=strlen(s1);
for(int i=0;i<len;i++)
s1[i+len]=s1[i]; int now=0;
dp[now][0]=1;
dp[now][1]=0; for(int i=1;i<=k;i++)
{
now=1-now;
dp[now][0]=(len-1)*dp[1-now][1]%mod;
dp[now][1]=(dp[1-now][0]+dp[1-now][1]*(len-2)%mod)%mod;
} //printf("%lld %lld\n",dp[now][0],dp[now][1]); LL ans=0;
for(int i=0;i<len;i++)
{
int pos=i;
for(int j=0,t=i;j<len;t++,j++)
{
if(s1[t]!=s2[j])
{
pos=-1;
break;
}
}
if(pos!=-1)
{
if(pos==0)
ans=(ans+dp[now][0])%mod;
else
ans=(ans+dp[now][1])%mod;
}
}
printf("%lld\n",ans);
return 0;
}

Codeforces 176B【计数DP】的更多相关文章

  1. Codeforces 176B (线性DP+字符串)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...

  2. Codeforces 176B 经典DP

    非常好的一个题目,CF上的DP都比较经典 题意就是 给定一个串A,B,正好执行K次操作,每次操作可以把 A串从中间切开,并调换两部分的位置,问最后得到B串共有多少种不同的切法(只要中间有一次不同,即视 ...

  3. CodeForces 176B Word Cut (计数DP)

    Word Cut Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit St ...

  4. HDU5800 To My Girlfriend 背包计数dp

    分析:首先定义状态dp[i][j][s1][s2]代表前i个物品中,选若干个物品,总价值为j 其中s1个物品时必选,s2物品必不选的方案数 那么转移的时候可以考虑,第i个物品是可选可可不选的 dp[i ...

  5. [DP之计数DP]

    其实说实在 我在写这篇博客的时候 才刚刚草了一道这样类型的题 之前几乎没有接触过 接触过也是平时比赛的 没有系统的做过 可以说0基础 我所理解的计数dp就是想办法去达到它要的目的 而且一定要非常劲非常 ...

  6. HDU4815/计数DP

    题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=4815] 简单说一下题意: 有n道题,每到题答对得分为a[ i ],假如A不输给B的最小概率是P,那么A ...

  7. HDU 6377 度度熊看球赛 (计数DP)

    度度熊看球赛 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  8. 计数dp

    计数dp 计数类的$dp$没做过几个,所以之前都放到"思维"标签下了,后来发现原来这属于一类问题啊...搬过来了. 管道取珠:https://www.lydsy.com/Judge ...

  9. [SDOI2010]地精部落[计数dp]

    题意 求有多少长度为 \(n\) 的排列满足 \(a_1< a_2> a_3 < a_4 \cdots\) 或者 $a_1> a_2 < a_3 > a_4\cdo ...

随机推荐

  1. Unity3d 新建xml 读取xml

    在游戏开发中.Xml常常被用来作为技能配置.地图配置.人物动作配置等配置文件. Unity3d内置的Xml库让我们非常方便地就能够新建Xml和读取Xml. 以下是一个样例,新建了一个Xml文档.而且读 ...

  2. iOS开发之NewsstandKit.framework的使用

    本文转载至 http://mobile.51cto.com/iphone-423385.htm   系统提供NewsstandKit.framework来支持newsstand类型的程序,就是在spr ...

  3. requests 中文乱码

    jsUrl = 'http://www.heze.cn/qiye/index.php?a=userinfo&username={}'.format(bizQiyeId)r = requests ...

  4. tomcat服务器配置java堆内存大小

    我用的是绿色免安装的tomcat,找到tomcat下的bin文件夹下的catalina.bat文件: 编辑该文件,编辑参数,没有的话手动加上: set JAVA_OPTS=-server -Xms51 ...

  5. java replaceAll Replace

    java ReplaceAll 的两个参数都必须是正则表达式. 在正则表达式中 \ (一个斜线)是用 \\ 来表示(即:用两个斜线表示一个斜线) 而在Java语言中 \ (一个斜线)是用 \\ 来表示 ...

  6. Web UI回归测试 -- BackstopJS 入门

    BackstopJS是一个测试工具,用于测试ui图和实际项目是否偏差. 话不多说,直接启动一个项目吧测试吧. 1.首先全局安装BackstopJS npm install -g backstopjs ...

  7. Linux下配置Objective-C编译环境

    Ubuntu环境下Objective-C编译环境配置参考这里. CentOS环境下Objective-C编译环境配置参考这里. 还在继续探索中.

  8. 解决 eclipse出现 Address already in use: bind

    今天开发遇到下面问题,贴出部分异常信息,如下: [WARNING] failed SelectChannelConnector@ java.net.BindException: Address alr ...

  9. css position弹性盒子测试

    总结: 1.利用样式height:100%设置div高度为全屏时候必须设置所有的父元素,但是父元素那么多,不可控,所以此法不可行: 2.设置父框架的padding为100px,div进行float,p ...

  10. ansible快速学习

    推荐文献: 表述的很不错, http://www.mamicode.com/info-detail-1428476.html 附加参考: http://laowafang.blog.51cto.com ...