Codeforces 176B (线性DP+字符串)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214
题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成新串。问经过K次变形后,与目标串相同的变形方案数。mod 1000000007。
解题思路:
奇葩的字符串DP。照着别人的题解写的,解释不出原理是什么。
首先统计出经过1次变形,就能和目标串相同的中间产物串(包含源串)的个数cnt。len表示源串长度,那么len-cnt就表示和目标串不同的个数。
用dp[i][0]表示第i步变形后,与目标串相同方案数,dp[i][1]则表示不同的方案数,
那么对于每次变形i:
dp[i][0]=dp[i-1][0]*(cnt-1)+dp[i-1][1]*cnt
dp[i][1]=dp[i-1][0]*(len-cnt)+dp[i-1][1]*(len-cnt-1)
-1的原因是本次变形要去掉自身变为自身的情况。
那么最后ans=dp[k][0]。
由于是线性DP,可以滚动数组优化内存,只要2*2空间就行了。
#include "cstdio"
#include "cstring"
#define maxn 2010
#define mod 1000000007
#define LL long long
char s[maxn],e[maxn];
LL dp[][],k,cnt=,len;
int main()
{
//freopen("in.txt","r",stdin);
scanf("%s%s%I64d",&s,&e,&k);
len=strlen(s);
for(int i=;i<len;i++)
{
s[i+len]=s[i];
if(!strncmp(s+i,e,len)) cnt++;
}
dp[][strncmp(s,e,len)!=]=;
for(int i=;i<=k;i++)
{
dp[i%][]=(dp[(i-)%][]*(cnt-)+dp[(i-)%][]*cnt)%mod;
dp[i%][]=(dp[(i-)%][]*(len-cnt)+dp[(i-)%][]*(len-cnt-))%mod;
}
printf("%I64d\n",dp[k%][]); }
| 2913373 | neopenx | CodeForces | 176B | Accepted | 30 | GNU C++ 4.6 | 602 |
2014-10-31 20:00:42
|
Codeforces 176B (线性DP+字符串)的更多相关文章
- CodeForces - 1051D (线性DP)
题目:https://codeforces.com/problemset/problem/1051/D 题意:一个2行n列的矩形,上面有黑白块,然后问你怎么布置才能有k个连通块,问有多少种方案数 思路 ...
- CodeForces - 1038D (线性DP)
题目:https://codeforces.com/problemset/problem/1038/D 题意:给你n个数字,每个数字可以吃左右两边的数,然后吃完后自己变成 a[i]-a[i+1]或者a ...
- Codeforces 176B 经典DP
非常好的一个题目,CF上的DP都比较经典 题意就是 给定一个串A,B,正好执行K次操作,每次操作可以把 A串从中间切开,并调换两部分的位置,问最后得到B串共有多少种不同的切法(只要中间有一次不同,即视 ...
- CodeForces 176B Word Cut (计数DP)
Word Cut Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit St ...
- [CodeForces - 1272D] Remove One Element 【线性dp】
[CodeForces - 1272D] Remove One Element [线性dp] 标签:题解 codeforces题解 dp 线性dp 题目描述 Time limit 2000 ms Me ...
- Nowcoder Removal ( 字符串上的线性 DP )
题目链接 题意 : 给出长度为 n 的字符串.问你准确删除 m 个元素之后.能产生多少种不同的子串 分析 ( 参考博客 ): 可以考虑线性 DP 解决这个问题 试着如下定义动态规划数组 dp[i][ ...
- LightOJ1044 Palindrome Partitioning(区间DP+线性DP)
问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...
- 动态规划——线性dp
我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...
- 动态规划_线性dp
https://www.cnblogs.com/31415926535x/p/10415694.html 线性dp是很基础的一种动态规划,,经典题和他的变种有很多,比如两个串的LCS,LIS,最大子序 ...
随机推荐
- 暑假热身 E. 无聊的LSY
LSY大牛没事就爱玩游戏,包括很多很无聊的游戏.某日,LSY大牛又找到了一个无聊的游戏:每一局游戏的开始,LSY大牛将代表自己的棋子放在一个线性棋盘的最左端(第0个格子,可以认为向右端无限延伸),接着 ...
- 《C#高级编程》学习笔记------C#中的委托和事件(续)
本文转载自张子阳 目录 为什么要使用事件而不是委托变量? 为什么委托定义的返回值通常都为void? 如何让事件只允许一个客户订阅?(事件访问器) 获得多个返回值与异常处理 委托中订阅者方法超时的处理 ...
- 关于Linux下进程间使用共享内存和信号量通信的时的编译问题
今天在编译一个使用信号量实现进程同步时,出现了库函数不存在的问题.如下图 编译结果实际上是说,没include相应的头文件,或是头文件不存在(即系统不支持该库函数) 但我man shm_open是可以 ...
- Python egg
http://blog.csdn.net/turkeyzhou/article/details/8876658
- codeforces B. Xenia and Ringroad 解题报告
题目链接:http://codeforces.com/problemset/problem/339/B 题目理解不难,这句是解题的关键 In order to complete the i-th ta ...
- mysql生成varchar类型主键排序
用uuid生成20位的主键 SELECT LEFT(REPLACE(UUID(), '-', ''),20) FROM DUAL 另一种方法: 因为数据库中有字母 需要排序的时候去除字母,重新取最大值 ...
- js如何往数组Array中添加元素
转载自:http://blog.sina.com.cn/s/blog_95fa28e60101mwup.html unshift:将参数添加到原数组开头,并返回数组的长度 pop:删除原数组最后一项 ...
- mybatis的insert简单使用
- javascript首尾反转字符
var my_str="Welcome to www.sharejs.com" var i=my_str.length; i=i-1; for (var x = i; x > ...
- atom 震动特效
1.下载atom 2.配置环境变量 3.运行apm install activate-power-mode 4.打开Atom激活(control+alt+o(是o不是零)) 注:新标签若没效果可以ct ...