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

 

Input
ab
ab
2
Output
1
Input
ababab
ababab
1
Output
2
Input
ab
ba
2
Output
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 && 递推)的更多相关文章

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

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

  2. ACM学习历程—UESTC 1217 The Battle of Chibi(递推 && 树状数组)(2015CCPC C)

    题目链接:http://acm.uestc.edu.cn/#/problem/show/1217 题目大意就是求一个序列里面长度为m的递增子序列的个数. 首先可以列出一个递推式p(len, i) =  ...

  3. 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 ...

  4. CodeForces 176B Word Cut dp

    Word Cut 题目连接: http://codeforces.com/problemset/problem/176/C Description Let's consider one interes ...

  5. CodeForces 176B - Word Cut 计数DP

    B. Word Cut   Let's consider one interesting word game. In this game you should transform one word i ...

  6. ACM学习历程—Codeforces Round #354 (Div. 2)

    http://codeforces.com/contest/676 在allzysyz学弟和hqwhqwhq的邀请下,打了我的第三场CF... 毕竟在半夜..所以本来想水到12点就去睡觉的...结果一 ...

  7. ACM学习历程—CodeForces 590A Median Smoothing(分类讨论 && 数学)

    题目链接:http://codeforces.com/problemset/problem/590/A 题目大意是给一个串,头和尾每次变换保持不变. 中间的a[i]变成a[i-1],a[i],a[i+ ...

  8. ACM学习历程—CodeForces 601A The Two Routes(最短路)

    题目链接:http://codeforces.com/problemset/problem/601/A 题目大意是有铁路和陆路两种路,而且两种方式走的交通工具不能在中途相遇. 此外,有铁路的地方肯定没 ...

  9. [Codeforces 176B]Word Cut

    Description 题库链接 给你两个字符串 \(S\) 和 \(T\) ,准许你 \(k\) 次操作,每次将字符串左右分成两个非空的部分,再交换位置,问你有多少种不同的操作方法将 \(S\) 串 ...

随机推荐

  1. HBase——完全分布

    实际上,在真实环境中你需要使用完全分布配置完整测试HBase.在一个分布式配置中,集群有多个节点,每个节点运行一个或多个HBase守护进程.其中包括主Master和备份Master实例,多个Zooke ...

  2. 查看mysql 的存储过程定义

    查询数据库中的存储过程 方法一: select `name` from mysql.proc where db = 'your_db_name' and `type` = 'PROCEDURE' 方法 ...

  3. Android中BaseAdapter使用基础点

    Android中要填充一些控件(如ListView)经常须要用到Adapter来实现,经常使用的有ArrayAdapter,SimpleAdapter, CursorAdapter,BaseAdapt ...

  4. uboot之bootm以及go命令的实现

    本文档简单介绍了uboot中用于引导内核的命令bootm的实现,同时分析了uImage文件的格式,还简单看了一下uboot下go命令的实现 作者: 彭东林 邮箱: pengdonglin137@163 ...

  5. delphi 解析Json格式(转自:http://blog.csdn.net/jayqiang/article/details/7066824)

    SuperObject 是开源的 Delphi 的 JSON 工具包,可生成 JSON 数据以及进行 JSON 解析. unit Unit6; interface uses Windows, Mess ...

  6. WPF SDK研究 之 数据绑定

    这一章介绍数据绑定.本章共计27个示例,全都在VS2008下.NET3.5测试通过,点击这里下载:ConnectedData.rar 1.ShowDataWithoutBinding注: <?M ...

  7. NuGet管理工具安装

    安装完成后VS重启即可

  8. 访问一个绝对地址把一个整型数强制转换 (typecast)为一个指针是合法的

    在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66.编译器是一个纯粹的ANSI编译器.写代码去完成这一任务. 解析:这一问题测试你是否知道为了访问一个绝对地址把一个整型数强制转换 ...

  9. GS与网络打交道

    与网络打交道 在GS,GC,Share都与网络打交道,但还是GC最多 GC打交道过程 send_stat BaseChannel::SendCmdTry() { if (!m_queCmd.size( ...

  10. Unix环境高级编程---信号

    参考博客:http://blog.csdn.net/alex_my/article/details/39494129 1. 信号概念 何为信号? 信号是一种软中断,可以由以下情形触发: -1: 用户按 ...