题意:

给你两个串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. js比较3个数字的大小

    <script> var a = [1, 5, 2, 123, 34, 43, 7]; var i = j = t = 0; //sort方法, 推荐使用 a.sort(function( ...

  2. JS中小数如何转化为百分数并能四舍五入

    <script type="text/javascript">//n表示百分数保留的位数 function toPercent(n){ n = n || 2; retu ...

  3. 九度OJ 1138:进制转换 (进制转换)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2388 解决:935 题目描述: 将一个长度最多为30位数字的十进制非负整数转换为二进制数输出. 输入: 多组数据,每行为一个长度不超过30 ...

  4. mysql-test-run.pl

    wget https://raw.githubusercontent.com/mysql/mysql-server/5.7/mysql-test/mysql-test-run.pl

  5. Ubuntu Firefox没有声音的解决方案

    安装ubuntu-restricted-extras sudo apt-get install ubuntu-restricted-extras 参考博文:解决ubuntu中firefox没有声音的问 ...

  6. mysql 修改语法格式

    1.修改字段注释格式 alter table {table} modify column {column} {type} comment '{comment}';

  7. HttpClient访问网络

    HttpClient项目时Apache提供用于访问网络的类,对访问网络的方法进行了封装.在HttpURlConnection类中的输入输出操作,统一封装成HttpGet.HttpPost.HttpRe ...

  8. mongodb学习之:安全和认证

    mongodb默认是不认证的,默认没有账号,只要能连接上服务就可以对数据库进行各种操作,mongodb认为安全最好的方法就是在一个可信的环境中运行它,保证之后可信的机器才能访问它.因此需要在登录的时候 ...

  9. Codeforces Round #178 (Div. 2) B. Shaass and Bookshelf —— DP

    题目链接:http://codeforces.com/contest/294/problem/B B. Shaass and Bookshelf time limit per test 1 secon ...

  10. C#入门---1、C#装备知识(C#如何学习)

    C#入门---1.C#装备知识(C#如何学习) 一.总结 一句话总结: 主视频,辅助书和教程:还是得看视频,直接看书或者看教程效率不高 1.C#和.NET的关系和区别? .net是一个平台,核心是.n ...