(纪中)1923. 密码编码(scode)【DFS】

57 篇文章 0 订阅

(File IO): input:scode.in output:scode.out
时间限制: 1000 ms 空间限制: 128000 KB 具体限制
Goto ProblemSet


题目描述
农夫约翰最近想发一些秘密的信息,但是他不想让奶牛们知道。这些信息是 ‘ A ’ ‘A’ A ’ Z ’ ’Z’ Z的字符组成的,长度至少是 2 2 2
为了对这些信息进行加密,农夫约翰对这些信息进行了一系列的操作,每次操作,约翰把字符串 S S S去掉从第一个开始连续的若干个字符或者从最后一个字符开始连续若干个字符(至少去掉一个字符,也不能全部去掉),然后把剩余的字符串添加到原来 S S S串的左边或者右边。例如,对于字符串 A B C ABC ABC,一次操作可以有 8 8 8种结果:
AABC
ABABC
BCABC
CABC
ABCA
ABCAB
ABCBC
ABCC
现在给定最后加密好的字符串,约翰想要知道这个字符串可能由多少种方法加密而来,注意, A A A AAA AAA可以由 A A AA AA通过四种加密操作得来,虽然产生的 A A A AAA AAA是一样的,但是加密的过程是不一样的我们就认为是不同的方法。


输入
一个字符串。

输出
输出这个加密的字符串可以由多少种方法加密而来。【答案要mod 2014】


样例输入
ABABA

样例输出
8


数据范围限制
字符串的长度不超过 100 100 100


提示
我们有8种方法可以得到 A B A B A ABABA ABABA

  1. S t a r t w i t h A B A − > A B + A B A Start with ABA -> AB+ABA StartwithABA>AB+ABA
  2. S t a r t w i t h A B A − > A B A + B A Start with ABA -> ABA+BA StartwithABA>ABA+BA
  3. S t a r t w i t h A B − > A B + A − > A B + A B A Start with AB -> AB+A -> AB+ABA StartwithAB>AB+A>AB+ABA
  4. S t a r t w i t h A B − > A B + A − > A B A + B A Start with AB -> AB+A -> ABA+BA StartwithAB>AB+A>ABA+BA
  5. S t a r t w i t h B A − > A + B A − > A B + A B A Start with BA -> A+BA -> AB+ABA StartwithBA>A+BA>AB+ABA
  6. S t a r t w i t h B A − > A + B A − > A B A + B A Start with BA -> A+BA -> ABA+BA StartwithBA>A+BA>ABA+BA
  7. S t a r t w i t h A B A B − > A B A B + A Start with ABAB -> ABAB+A StartwithABAB>ABAB+A
  8. S t a r t w i t h B A B A − > A + B A B A Start with BABA -> A+BABA StartwithBABA>A+BABA

解题思路
题目大意:
求一个字符串可以由多少种变化而来,变化为:从左边(或者从右边)截取若干字符串(能删一个,不能全删),将其放在原串的左边或者右边。
这道题可以用一种奇怪的“深搜”来解决。
将一个字符串分为 a , b , … , c , d a,b,…,c,d a,b,,c,d
f = a + b + … f=a+b+… f=a+b+
e = … + c + d e=…+c+d e=+c+d
一个 f o r for for语句,我们可以得知我们截取的字符串,会在“原串”中有对应的字符串,如果存在,那么它必然在左边或者右边,不可能在左边,所以我们可以在对e或f进行继续处理。。。


代码

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<map>
#include<cmath>
using namespace std;
map<string,int>a; 
string s1;
int dfs(string s)
{
    if(a[s])
    return a[s];
    int ans=0,l;
    string a1,b,c,d,e,f;
    l=s.size();
    for(int i=0;(i+1)*2<l;i++)
    {
        a1=s.substr(0,i+1);
        b=s.substr(i+1,i+1);
        c=s.substr(l-i-1,i+1);
        d=s.substr(l-i-i-2,i+1);
        e=s.substr(i+1,l-i-1); 
        f=s.substr(0,l-i-1); 
        if(a1==b) ans+=dfs(e);
        if(a1==c) ans+=dfs(e);
        if(c==a1) ans+=dfs(f);
        if(c==d) ans+=dfs(f);
    }
    if(l>=2) ans++; 
    ans=ans%2014;
    a[s]=ans; 
    return ans; 
}
int main()
{
    freopen("scode.in","r",stdin);
   freopen("scode.out","w",stdout);
    cin>>s1;
    cout<<dfs(s1)-1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值