博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P3102 [USACO14FEB]秘密代码Secret Code 解题报告
阅读量:4939 次
发布时间:2019-06-11

本文共 3981 字,大约阅读时间需要 13 分钟。

P3102 [USACO14FEB]秘密代码Secret Code

题目描述

Farmer John has secret message that he wants to hide from his cows; the message is a string of length at least 2 containing only the characters A..Z.

To encrypt his message, FJ applies a sequence of "operations" to it, where an operation applied to a string S first shortens S by removing either some (but not all) of the initial characters or some (but not all) of the final characters from S, after which the original string S is attached either at the beginning or end. For example, a single operation to the string ABC could result in eight possible strings:

AABC ABABC BCABC CABC ABCA ABCAB ABCBC ABCC Given the final encrypted string, please count the number of possible ways FJ could have produced this string using one or more repeated operations applied to some source string. Operations are treated as being distinct even if they give the same encryption of FJ's message. For example, there are four distinct separate ways to obtain AAA from AA.

Print your answer out modulo 2014.

农民约翰收到一条的消息,记该消息为长度至少为2,只由大写字母组成的字符串S,他通过一系列操作对S进行加密。

他的操作为,删除S的前面或者后面的若干个字符(但不删光整个S),并将剩下的部分连接到原字符串S的前面或者后面。如对于S=‘ABC’,共有8总可能的操作结果:

AABC

ABABC

BCABC

CABC

ABCA

ABCAB

ABCBC

ABCC

给出加密后的目标字符串,请计算共有多少种加密的方案。

对于同字符的字符串,加密方案不止一种,比如把AA加密成AAA,共有4种加密方案。将你的答案mod 2014后输出。

输入输出格式

输入格式:

  • Line 1: A single encrypted string of length at most 100.

输出格式:

  • Line 1: The number of ways FJ could have produced this string with one or more successive operations applied to some initial string of length at least 2, written out modulo 2014. If there are no such ways, output zero.

说明

Here are the different ways FJ could have produced ABABA:

  1. Start with ABA -> AB+ABA

  2. Start with ABA -> ABA+BA

  3. Start with AB -> AB+A -> AB+ABA

  4. Start with AB -> AB+A -> ABA+BA

  5. Start with BA -> A+BA -> AB+ABA

  6. Start with BA -> A+BA -> ABA+BA

  7. Start with ABAB -> ABAB+A

  8. Start with BABA -> A+BABA


不知道为什么最近总感觉\(dp\)题挺难想的。

这题大概写了有一个小时,最开始想了一种0/1判左右的方法,发现不行,遂改成区间\(DP\)

\(dp[i][j]\)代表长度左区间为\(i\)右区间为\(j\)的串的构造方案(注意这题是可以构造很多次的)

\(dp[i][j]=\sum dp[i][k_1]+\sum dp[k_2][j]\),合法性判断参照题目。

复杂度:\(O(N^4)\),不过先用Floyd预处理合法性可以优化掉一维。

其实不优化也差不了太远,毕竟上限远远达不到。

我交了题目才看到别人写的Floyd优化emmmm


code:

#include 
#include
const int mod=2014;const int N=105;int dp[N][N],n;char s[N];int main(){ scanf("%s",s+1); n=strlen(s+1); for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) dp[i][j]=1; dp[1][n]=0; for(int i=n-1;i;i--) for(int j=i+1;j<=n;j++) { int l=j+1-i,r=l-1>>1; for(int k=1;k<=r;k++) { int flag=1; int l1=i,l2=i+k; for(int q=k;q;q--,l1++,l2++) if(s[l1]!=s[l2]) { flag=0; break; } if(flag) dp[i][j]=(dp[i+k][j]+dp[i][j])%mod; flag=1,l1=i+k-1,l2=j; for(int q=k;q;q--,l1--,l2--) if(s[l1]!=s[l2]) { flag=0; break; } if(flag) dp[i][j]=(dp[i][j]+dp[i+k][j])%mod; } for(int k=1;k<=r;k++) { int flag=1; int r1=j,r2=j-k; for(int q=k;q;q--,r1--,r2--) if(s[r1]!=s[r2]) { flag=0; break; } if(flag) dp[i][j]=(dp[i][j]+dp[i][j-k])%mod; flag=1,r1=i,r2=j-k+1; for(int q=k;q;q--,r1++,r2++) if(s[r1]!=s[r2]) { flag=0; break; } if(flag) dp[i][j]=(dp[i][j]+dp[i][j-k])%mod; } } printf("%d\n",dp[1][n]%mod); return 0;}

2018.6.12

转载于:https://www.cnblogs.com/butterflydew/p/9171451.html

你可能感兴趣的文章
windons下一些软件的地址
查看>>
numpy ndarray 返回 index 问题
查看>>
leetcode 8. String to Integer (atoi)
查看>>
USACO section1.2 Name That Number
查看>>
Android 用application保存全局变量,关于Android中传递数据的一些讨论
查看>>
[Google Android] RelativeLayout 布局底部的EditText会被弹出的键盘遮挡
查看>>
(随用随总结)Linux下面的特殊权限&不同的文件类型
查看>>
Failed to start component [StandardEngine[Catalina].
查看>>
[VBA]批量新建指定名称的工作表
查看>>
委托与事件的关系
查看>>
固定资产管理系统 概要说明书说明书
查看>>
类的绑定方法
查看>>
2016-5-25授课(3)
查看>>
新增加的元素 相关操作获取不到
查看>>
Zabbix 3.0编译安装
查看>>
json介绍及简单示例
查看>>
h.264 率失真优化
查看>>
【转】拓扑排序入门
查看>>
Spring中Bean的命名问题(id和name区别)及ref和idref之间的区别
查看>>
How to install 64-bit Google Chrome 28+ on 64-bit RHEL/CentOS 6 or 7
查看>>