Description

题库链接

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

\(1\leq k\leq 100000, 1\leq |S|=|T|\leq 1000\)

Solution

容易发现不论经过多少次操作,其操作后的字符串一定是在原字符串上截开两段再拼接而成。

所以不妨记 \(f_{i,j}\) 为操作 \(i\) 次后在 \(j\) 处截开的方案数为 \(f_{i,j}\) 。

转移就是由 \(i-1\) 中所有 \(\neq j\) 的位置转移过来的。

但复杂度是 \(O(|S|k)\) 的,不太优雅。但其实考虑到所有字符串本质只有与 \(T\) 串相不相同的两种情况,我们不妨记 \(f_{i,0/1}\) 表示操作 \(i\) 次后与 \(T\) 串是否相同的方案数为 \(f_{i,j}\) 。

这样就可以线性转移了。但是要先 \(O(|S|^2)\) 预处理出 \(same\) ,表示多少个位置断开与 \(T\) 串本质相同。

Code

#include <bits/stdc++.h>
using namespace std;
const int N = 1000, yzh = 1e9+7; char s[N+5], t[N+5];
int same, len, f[N*100+5][2], k; bool check(int x) {
for (int i = 1; i <= len; i++) {
if (s[x] != t[i]) return false;
++x; if (x > len) x = 1;
}
return true;
}
void work() {
scanf("%s%s", s+1, t+1); len = strlen(s+1); scanf("%d", &k);
for (int i = 1; i <= len; i++)
if (check(i)) ++same;
if (check(1)) f[0][0] = 1; else f[0][1] = 1;
for (int i = 1; i <= k; i++) {
f[i][0] = (1ll*f[i-1][0]*(same-1)%yzh+1ll*f[i-1][1]*same%yzh)%yzh;
f[i][1] = (1ll*f[i-1][0]*(len-same)%yzh+1ll*f[i-1][1]*(len-same-1)%yzh)%yzh;
}
printf("%d\n", f[k][0]);
}
int main() {
work(); return 0;
}

[Codeforces 176B]Word Cut的更多相关文章

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

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

  2. CodeForces 176B Word Cut dp

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

  3. CodeForces 176B - Word Cut 计数DP

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

  4. ACM学习历程—CodeForces 176B Word Cut(字符串匹配 && dp && 递推)

    Description Let's consider one interesting word game. In this game you should transform one word int ...

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

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

  6. codeforces 883H - Palindromic Cut - [字符串处理]

    题目链接:http://codeforces.com/problemset/problem/883/H Time limit: 3000 ms Memory limit: 262144 kB Koly ...

  7. CodeForces 982 C Cut 'em all!

    Cut 'em all! 题意:求删除了边之后,剩下的每一块联通块他的点数都为偶数,求删除的边最多能是多少. 题解:如果n为奇数,直接返回-1,因为不可能成立.如果n为偶数,随意找一个点DFS建树记录 ...

  8. Codeforces 189A:Cut Ribbon(完全背包,DP)

    time limit per test : 1 second memory limit per test : 256 megabytes input : standard input output : ...

  9. CodeForces 614A Link/Cut Tree

    #include<cstdio> #include<cstring> #include<cmath> #include<stack> #include& ...

随机推荐

  1. Java基础学习笔记二十一 多线程

    多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念.进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线 ...

  2. 【福大软工】 W班级总成绩排名3

    评分链接: alpha测试    软件产品案例分析 总分排名: 团队千帆竞发图 总结: 本次排名是alpha测试    软件产品案例分析 两次排名的汇总. 1.alpha测试小组评价: 听说:10篇冲 ...

  3. 福州大学W班-个人最终成绩统计

    千帆竞发图 平时分: 项目分: 详细得分 平时分: 项目分: 个人最终得分:

  4. C语言第一次博客作业---顺序机构基础练习

    一.PTA实验作业 题目1.温度转换 本题要求编写程序,计算华氏温度150°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1.实验代 ...

  5. Software Engineering-HW8 个人总结

    Software Engineering-HW8 个人总结 2017282110264 李世钰 一.请参考第一次作业,当初你对课程的承诺和期望都兑现了吗? 大致实现了.经过了最后的团队项目,基本了解一 ...

  6. 1013团队Beta冲刺day6

    项目进展 李明皇 今天解决的进度 进行前后端联动调试 明天安排 完善程序运行逻辑 林翔 今天解决的进度 服务器端发布消息,删除消息,检索消息,个人发布的action 明天安排 图片功能遇到问题,微信小 ...

  7. 团队作业2:需求分析&原型设计

    Deadline: 2017-11-5  22:00PM,以博客发表日期为准.   评分基准: 按时交 - 有分,检查的项目包括后文的三个方面 需求分析 原型设计 编码规范 晚交 - 0分 迟交两周以 ...

  8. iOS开发UIKit框架-可视化编程-XIB

    1. Interface Builder 可视化编程 1> 概述 GUI : 图形用户界面(Graphical User Interface, 简称GUI, 又称图形化界面) 是指采用图形方式显 ...

  9. vivado License导入方法与资源获取

    前言 以下安装说明基于已经正确安装vivado 笔者操作环境:linux vivado版本:2015.2 vivado License导入方法: 点击菜单栏[Help],选择[Manage Licen ...

  10. Django 博客

    blogproject/blogproject/settings.py ## 其它配置代码... # 把英文改为中文 LANGUAGE_CODE = 'zh-hans' # 把国际时区改为中国时区 T ...