ACM学习历程—CodeForces 176B Word Cut(字符串匹配 && dp && 递推)
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
1
ababab
ababab
1
2
ab
ba
2
0
Sample Output
Hint
The sought way in the first sample is:
ab → a|b → ba → b|a → ab
In the second sample the two sought ways are:
- ababab → abab|ab → ababab
- ababab → ab|abab → ababab
题目大意就是问有几种操作方法,能在k次操作下得到目标串。
首先要肯定的是题目给的操作相当于一个循环串的位移。(位移不为0)
这样的话,就可以对目标串的第一位分析了。
记s(now, k)表示经过k次操作后,目标串的第一位在当前串的第now位。(初始k == 0时,由于串是循环串,会出现不止一个now的值不为0)
于是s(now, k) = sum{s(i, k-1)} (i != now)
只要不是本身就在now,都能位移到now。
大一时做这个题,到就只能想到这里,然后进行了O(k*strlen(str)*strlen(str))的暴力运算。
但是上述式子可以进行一定的变形:
s(now, k) = sum - s(now, k-1)
这样的话,只需要记录下sum,就能在O(k*strlen(str))的时间复杂度下完成了。
需要注意的是,由于采用一维dp会导致计算s(now)的时候破坏了前一个状态。
所以此处需要同时保存前一个状态和当前状态。所以开了第二维,且第二维仅保留两次的状态。(此处采用了亦或运算进行优化)
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#define N 1000000007 using namespace std; char from[], to[];
int n, len, s[][], sum; bool Pair(int now)
{
int i = ;
for (;;)
{
if (i == len)
return true;
if (from[now] != to[i])
return false;
i++;
now = (now+) % len;
}
} bool Input()
{
if (scanf("%s", from) == EOF)
return false;
scanf("%s%d", to, &n);
memset(s, , sizeof(s));
len = strlen(from);
sum = ;
for (int i = ; i < len; ++i)
{
if (Pair(i))
{
s[i][] = ;
sum++;
}
}
return true;
} void Work()
{
int tem, state = ;
for (int i = ; i <= n; i++)
{
tem = ;
state = state^;
for (int j = ; j < len; ++j)
{
s[j][state] = sum - s[j][state^];
s[j][state] = (s[j][state]%N+N)%N;
tem += s[j][state];
tem %= N;
}
sum = tem;
}
printf("%d\n", s[][state]);
} int main()
{
//freopen("test.in", "r", stdin);
while (Input())
{
Work();
}
return ;
}
ACM学习历程—CodeForces 176B Word Cut(字符串匹配 && dp && 递推)的更多相关文章
- CodeForces 176B Word Cut (计数DP)
Word Cut Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit St ...
- ACM学习历程—UESTC 1217 The Battle of Chibi(递推 && 树状数组)(2015CCPC C)
题目链接:http://acm.uestc.edu.cn/#/problem/show/1217 题目大意就是求一个序列里面长度为m的递增子序列的个数. 首先可以列出一个递推式p(len, i) = ...
- ACM学习历程—HDU1028 Ignatius and the Princess III(递推 || 母函数)
Description "Well, it seems the first problem is too easy. I will let you know how foolish you ...
- CodeForces 176B Word Cut dp
Word Cut 题目连接: http://codeforces.com/problemset/problem/176/C Description Let's consider one interes ...
- CodeForces 176B - Word Cut 计数DP
B. Word Cut Let's consider one interesting word game. In this game you should transform one word i ...
- ACM学习历程—Codeforces Round #354 (Div. 2)
http://codeforces.com/contest/676 在allzysyz学弟和hqwhqwhq的邀请下,打了我的第三场CF... 毕竟在半夜..所以本来想水到12点就去睡觉的...结果一 ...
- ACM学习历程—CodeForces 590A Median Smoothing(分类讨论 && 数学)
题目链接:http://codeforces.com/problemset/problem/590/A 题目大意是给一个串,头和尾每次变换保持不变. 中间的a[i]变成a[i-1],a[i],a[i+ ...
- ACM学习历程—CodeForces 601A The Two Routes(最短路)
题目链接:http://codeforces.com/problemset/problem/601/A 题目大意是有铁路和陆路两种路,而且两种方式走的交通工具不能在中途相遇. 此外,有铁路的地方肯定没 ...
- [Codeforces 176B]Word Cut
Description 题库链接 给你两个字符串 \(S\) 和 \(T\) ,准许你 \(k\) 次操作,每次将字符串左右分成两个非空的部分,再交换位置,问你有多少种不同的操作方法将 \(S\) 串 ...
随机推荐
- Linux进程间通信(IPC)编程实践(十二)Posix消息队列--基本API的使用
posix消息队列与system v消息队列的区别: (1)对posix消息队列的读总是返回最高优先级的最早消息,对system v消息队列的读则能够返回随意指定优先级的消息. (2)当往一个空队列放 ...
- OpenStack安装CentOS镜像:Device eth0 does not seem to be present, delaying initialization
解决办法:删除 /etc/udev/rules.d/70-persistent-net.rules 后重启机器.70-persistent-net.rules这个文件确定了网卡与MAC地址的绑定,cl ...
- erlang的timer定时器浅析
timer作为其计时器: erlang的计时器timer是通过一个唯一的timer进程实现的,该进程是一个gen_server,用户通过timer:send_after和timer:apply_aft ...
- linux lamp
1. 用yum安装Apache,Mysql,PHP. 1.1安装Apache yum install httpd httpd-devel 安装完成后,用/etc/init.d/httpd start ...
- 目标检测之hog(梯度方向直方图)---hog简介0
梯度直方图特征(HOG) 是一种对图像局部重叠区域的密集型描述符, 它通过计算局部区域的梯度方向直方图来构成特征.Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功 ...
- weblogic宕机crash问题解决分享
近期比較烦躁.系统频繁出现宕机.weblogic控制台打印出例如以下内容: # Afatal error has been detected by the Java Runtime Environme ...
- libEasyPlayer RTSP windows播放器SDK API接口设计说明
概述 libEasyPlayer实现对RTSP直播流进行实时采集和解码显示,稳定,高效,低延时:解码可采用intel硬件解码和软件解码两种方式,能实时进行录像和快照抓图,OSD叠加等功能. API接口 ...
- JavaScript toFixed() 方法注意点
定义和用法 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字. 语法 NumberObject.toFixed(num) 参数 描述 num 必需.规定小数的位数,是 0 ~ ...
- MySQL多表查询一网打尽
现有四张表 mysql> select * from student; +------+--------+-------+-------+ | s_id | s_name | s_age | s ...
- Android系统文件目录