Secret Code
Secret Code
一、题目
【NOIP模拟赛A10】Secret Code
时间限制: 1 Sec 内存限制: 128 MB
提交: 10 解决: 6
[提交][状态][讨论版]
题目描述
农夫John(以后简称“FJ”)有些不想让他的奶牛看见的秘密消息;这条消息是一个长度至少为2仅包含字符A..Z的字符串。为了加密他的消息,FJ对这条消息进行了一系列“操作”。一次对字符串S的“操作”是指去掉S开头的若干个字母(但不是全部)或末尾的若干个字母(但不是全部),然后将原来的S拼接到其开头或末尾。例如,一次对于字符串ABC的操作可能有以下8种结果:
AABC
ABABC
BCABC
CABC
ABCA
ABCAB
ABCBC
ABCC
已知最终加密后的字符串,请计算FJ有多少种可能的方法对某一源字符串进行一次或多次重复的“操作”得到该加密字符串。尽管对一个字符串的不同方法的“操作”可能得到相同的结果,这些方式也应该被视作不同而被分别计数。例如,有4种不同的操作方法从AA得到AAA。
输入
第1行:一个长度不超过100的字符串。
输出
第1行:FJ对某个长度至少为2的源字符串进行一次或多次操作后能够得到该结果字符串的不同方法数,答案可能会很大,答案请对2014求余。如果没有方法得到结果字符串,则输出0。
样例输入
ABABA
样例输出
8
提示
以下是FJ可以得到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
二、代码及分析
代码一:

/*
* 状态:
* f[i][j]表示以i为起点以j为终点的字符串出现的次数
* 最终状态:
* f[1][n]
* 初始状态:
* 初始结果字符串的所有的子字符串出现的次数都为1
* 因为我们是要用子串得到别的串,而这个子串最开始出现的次数就为1
* 状态转移方程:
* f[i][j]+=f[i][k]*f[k+1][j] (i<=k<j)(并且满足短串是长串的头尾字串);
*
* f[1][3]=f[1][1]*f[2][3]+f[1][2]*f[3][3];
* 短的串要是长的串的子串(并且是那种只截取前面或者只截取后面的那种)
*/ #include <iostream>
#include <cstring>
using namespace std;
int f[][];
char s[];
int len; void printRead();
void readData(){
scanf("%s",s+);
len=strlen(s+);
} void printArr_f();
void initArr_f(){
//因为任意一个长度不为Len的串都可以作为起始串
//所以任意一个长度不为Len的串起始可能性都为1
for(int i=;i<=len;i++){
for(int j=i;j<=len;j++){
f[i][j]=;
}
}
//因为必须要截掉头尾,故长度为len的串不行
//我不可能去用1-n这个字符串去得到别的字符串吧,所以出现次数为0
f[][len]=;
} //求字符串(c,d)是不是(a,b)的前子字符串
bool frontSubstring(){ } //求字符串(c,d)是不是(a,b)的后子字符串
bool backSubstring(){ } void init(){
readData();
printRead();
initArr_f();
printArr_f();
} void dp(){
for(int i=len;i>=;i++){
for(int j=i+;j<=len;j++){
for(int k=i;k<=j;k++){
f[i][j]+=f[i][k]*f[k+][j];
}
}
}
} int main(){
freopen("src/in.txt","r",stdin);
init();
dp();
return ;
} void printRead(){
for(int i=;i<=len;i++){
cout<<s[i];
}
cout<<endl;
} void printArr_f(){
for(int i=;i<=len;i++){
for(int j=;j<=len;j++){
cout<<f[i][j]<<" ";
}
cout<<endl;
}
}
AC代码
#include<bits/stdc++.h>
using namespace std;
char s[];
int ans[][];
//ans[i][j]中存储从s中的第i个元素到第j个元素有多少种出现的可能
bool Front_Maybe(int a,int b,int c,int d)
{
for(int i = a;i <= b;i ++)
{
if(s[i] != s[c + i - a]) return ;
}
// printf("前面%d %d %d %d\n",a,b,c,d);
return ;
}
bool Behind_Maybe(int a,int b,int c,int d)
{
for(int i = b;i >= a;i --)
{
if(s[i] != s[d - b + i]) return ;
}
// printf("后面%d %d %d %d\n",a,b,c,d);
return ;
}
int main()
{
freopen("src/in.txt","r",stdin);
scanf("%s",s + );
int Len = strlen(s + );
for(int i = ;i < Len;i ++)//起始串的长度
{
for(int j = ;j <= Len;j ++)//起始串的起点
{
//i是长度,j是起点,那么i+j-1就是终点
//如果终点大于长度
if(i + j - > Len) continue;
ans[j][i + j - ] = ;
//因为任意一个长度不为Len的串都可以作为起始串
//所以任意一个长度不为Len的串起始可能性都为1
}
}
for(int i = ;i < Len;i ++)//当前要处理串的长度
{
for(int j = ;j <= Len;j ++)//当前要处理串的起点
{
if(i + j - > Len) continue;
for(int x = ;x < i;x ++)//添加串的长度
{
if(j - x > )//向后加处理串 起点合法
{
if(Front_Maybe(j - x,j - ,j,j + i - ))
{
ans[j - x][i + j - ] += ans[j][i + j - ];
}
if(Behind_Maybe(j - x,j - ,j,j + i - ))
{
ans[j - x][i + j - ] += ans[j][i + j - ];
}
ans[j - x][i + j - ] %= ;
}
if(i + j - + x <= Len)//向前加处理串 终点合法
{
if(Front_Maybe(j + i,j + i - + x,j,j + i - ))
{
ans[j][i + j - + x] += ans[j][i + j - ];
}
if(Behind_Maybe(j + i,j + i - + x,j,j + i - ))
{
ans[j][i + j - + x] += ans[j][i + j - ];
}
ans[j][i + j - + x] %= ;
}
}
}
}
printf("%d",ans[][Len]);
return ;
}
Secret Code的更多相关文章
- Android Secret Code
我们很多人应该都做过这样的操作,打开拨号键盘输入*#*#4636#*#*等字符就会弹出一个界面显示手机相关的一些信息,这个功能在Android中被称为android secret code,除了这些系 ...
- hdu.1111.Secret Code(dfs + 秦九韶算法)
Secret Code Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- Android 编程下的 Secret Code
我们很多人应该都做过这样的操作,打开拨号键盘输入 *#*#4636#*#* 等字符就会弹出一个界面显示手机相关的一些信息,这个功能在 Android 中被称为 Android Secret Code, ...
- The secret code
The secret code Input file: stdinOutput file: stTime limit: 1 sec Memory limit: 256 MbAfter returnin ...
- [swustoj 679] Secret Code
Secret Code 问题描述 The Sarcophagus itself is locked by a secret numerical code. When somebody wants to ...
- 洛谷 P3102 [USACO14FEB]秘密代码Secret Code 解题报告
P3102 [USACO14FEB]秘密代码Secret Code 题目描述 Farmer John has secret message that he wants to hide from his ...
- HDU 1111 Secret Code(数论的dfs)
Secret Code Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- 【微信】根据appid, secret, code获取用户基本信息
function getUserInfo(){ $appid = "yourappid"; $secret = "yoursecret"; $code = $_ ...
- 洛谷P3102 [USACO14FEB]秘密代码Secret Code
P3102 [USACO14FEB]秘密代码Secret Code 题目描述 Farmer John has secret message that he wants to hide from his ...
随机推荐
- 基于TCP_socket套接字实现远程执行命令
基于tcp的套接字实现远程执行命令的操作 ——客户端敲命令,服务端执行 #服务端 import socket import subprocess phone=socket.socket(socket. ...
- Java里的4种引用类型
Java语言中,除了基本数据类型外,其他的都是指向各类对象的对象引用:Java中根据其生命周期的长短,将引用分为4类. 1 强引用 特点:我们平常典型编码Object obj = new Object ...
- F110的几个功能
1.F-59, 没有找到函数, 使用BDC BAPI_ACC_DOCUMENT_POST 必须创建有借贷2 line 的凭证,需求要参考原始的SA类型凭证, 创建一个单条的 科目 = 供应商 的凭证, ...
- Quartz使用总结(转发:http://www.cnblogs.com/drift-ice/p/3817269.html)
Quartz可以用来做什么? Quartz是一个任务调度框架.比如你遇到这样的问题 想每月25号,信用卡自动还款 想每年4月1日自己给当年暗恋女神发一封匿名贺卡 想每隔1小时,备份一下自己的爱情动作片 ...
- Linux基础系列:常用命令(1)
1.开启Linux操作系统,要求以root用户登录GNOME图形界面,语言支持选择为汉语 2.使用快捷键切换到虚拟终端2,使用普通用户身份登录,查看系统提示符 命令:ctrl+alt+F2 3.使用命 ...
- SpringMVC:学习笔记(9)——文件下载
SpringMVC—文件下载 说明 两个案例 1.为登录用户提供下载服务. 2.阻止仅通过输入网址即可获取下载. 文件下载概览 为了将文件发送给浏览器,我们需要在控制器中完成以下操作: 对请求处理方法 ...
- PHP......会话控制SESSION与COOKIE
一.SESSION Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序的 Web 页之间跳转时,存储在 ...
- Linux文件系统管理 常见命令df、du、fsck、dumpe2fs
概述 Linux文件系统管理 常见命令df.du.fsck.dumpe2fs. 文件系统查看命令:df 通过 df 命令可以査看已经挂载的文件系统的信息包括设备文件名.文件系统总大小.已经使用的大小. ...
- Python编程-多道技术和进程
一.多道技术 1.多路复用 操作系统主要使用来 记录哪个程序使用什么资源 对资源请求进行分配 为不同的程序和用户调解互相冲突的资源请求. 我们可将上述操作系统的功能总结为: 处理来自多个程序发起的多个 ...
- python日志操作logging
步骤: 1.定义一个日志收集器 my_logger = logging.getLogger("kitty") 2.设定级别.默认为warning:debug,,info,error ...