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的更多相关文章

  1. Android Secret Code

    我们很多人应该都做过这样的操作,打开拨号键盘输入*#*#4636#*#*等字符就会弹出一个界面显示手机相关的一些信息,这个功能在Android中被称为android secret code,除了这些系 ...

  2. hdu.1111.Secret Code(dfs + 秦九韶算法)

    Secret Code Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  3. Android 编程下的 Secret Code

    我们很多人应该都做过这样的操作,打开拨号键盘输入 *#*#4636#*#* 等字符就会弹出一个界面显示手机相关的一些信息,这个功能在 Android 中被称为 Android Secret Code, ...

  4. The secret code

    The secret code Input file: stdinOutput file: stTime limit: 1 sec Memory limit: 256 MbAfter returnin ...

  5. [swustoj 679] Secret Code

    Secret Code 问题描述 The Sarcophagus itself is locked by a secret numerical code. When somebody wants to ...

  6. 洛谷 P3102 [USACO14FEB]秘密代码Secret Code 解题报告

    P3102 [USACO14FEB]秘密代码Secret Code 题目描述 Farmer John has secret message that he wants to hide from his ...

  7. HDU 1111 Secret Code(数论的dfs)

    Secret Code Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit ...

  8. 【微信】根据appid, secret, code获取用户基本信息

    function getUserInfo(){ $appid = "yourappid"; $secret = "yoursecret"; $code = $_ ...

  9. 洛谷P3102 [USACO14FEB]秘密代码Secret Code

    P3102 [USACO14FEB]秘密代码Secret Code 题目描述 Farmer John has secret message that he wants to hide from his ...

随机推荐

  1. MogoDB 分片键

    MongoDB 根据分片键分割 collection 中的文档,然后分配到分片集群的成员中. 分片键可以是一个存在于每个文件中的索引字段或者复合索引字段. MongoDB 使用不同范围的分片键值来分割 ...

  2. centos7 终端修改字体大小

    如果你觉得你的终端字体太小了,停下来看一看这里可以帮你快捷修改字体大小 修改字体大小(这个是最坑爹的) 其实关键的命令就一个:setfont 但是setfont后面要跟的字体到底要写什么就的具体去查了 ...

  3. YAMLException: can not read a block mapping entry; a multiline key may not be an implicit key at line 5, column 1:

    创建的md文件头部声明中没有加空格.

  4. Java基础—抽象类和接口

    1.抽象类 在Java语言中使用abstrac关键字来定义抽象类和抽象方法,抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号. public abstract class Employee { ...

  5. $用python实现快速排序算法

    本文主要介绍用python实现基本的快速排序算法,体会一下python的快排代码可以写得多么简洁. 1. 三言两语概括算法核心思想 先从待排序的数组中找出一个数作为基准数(取第一个数即可),然后将原来 ...

  6. java WordUtils word文档工具类

    package com.sicdt.library.core.utils; import java.io.ByteArrayOutputStream; import java.io.IOExcepti ...

  7. 多个网络请求成功返回再执行另外任务的思路分析(iOS)

    前言 今天我们来讨论一个经常出现的需求场景,也是一个老话题.在开发中我们往往会遇到需要进行多个网络请求,并且需要多个网络请求成功返回后再做其他事的场景.比如同一个界面显示的内容需要用到两个网络接口,而 ...

  8. [POI2009]Wie

    题目 BZOJ 虽然是解压题但也学到了简洁的码风 做法 \(dijkstra\)跑动规 My complete code #include<bits/stdc++.h> #include& ...

  9. [APIO2013]机器人

    题目描述 VRI(Voltron 机器人学会)的工程师建造了 n 个机器人.任意两个兼容的机 器人站在同一个格子时可以合并为一个复合机器人. 我们把机器人用 1 至 n 编号(n ≤ 9).如果两个机 ...

  10. Apache2.4整合tomcat8

    1,编译mod_jk.so 不同版本apache对应不同的mod_jk,试验用tomcat-connectors-1.2.41-src.tar.gz , 下载后,解压,进入./native文件夹依次输 ...