Secret Code(原题和变形题)

洛谷传送
牛客网题一
牛客网题二
没错牛客网有两个题,牛客网题一和洛谷是一样的题,牛客网题二是题一的变形

时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
链接:https://ac.nowcoder.com/acm/contest/4860/G
来源:牛客网

输入描述:

  • 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.

题一:

示例1
输入

ABABA

输出

8

题意:
一个长度至少为2仅包含字符A~Z的字符串。为了加密他的消息,FJ对这条消息进行了一系列“操作”。一次对字符串S的“操作”是指去掉S开头的若干个字母(但不是全部)或末尾的若干个字母(但不是全部),然后将原来的S拼接到开头或末尾。
给你操作后的字符串,问你操作前有几种情况?
我们看看样例:
ABABA
输出是8,哪8种呢?如下:

Start with ABA -> AB+ABA

Start with ABA -> ABA+BA

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

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

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

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

Start with ABAB -> ABAB+A

Start with BABA -> A+BABA

我们注意到什么样的可以作为操作前的候选串:至少可以通过拆分构造出原串的头和尾
我们可以这么想

分三种情况:
第一种:看头和尾
样例: A B A B A
首先首尾的两个字符相等(都是A),那也就是开头的可以被省掉,(因为省掉后BABA可以通过去除BAB后剩下A再加上原串BABA构成原本的ABABA,好好想想是不是),那同理结尾的A也可省略了,省略后就是ABAB。
省略后的BABA也进行这样的过程 ,看首尾分别是BA不相等,那指针都向中间移动,再看首(BA)尾(BA)是否相等,发现相等,那首可以省略吧,那尾也可以省略吧 ,这就是两种情况了。一直进行下去直到字符串的长度为2或者不满足条件
第二种:看开头
样例A B A B C
id 0 1 2 3 4
比较第一个开头(A(id=0))和第二个开头(B(id=1)),发现不一样范围同时扩大,第一个开头就是(A B(id=0,1)),第二个开头就是(A B(id=2,3)),发现相同那么第一个开头就可以省略了,就剩下ABC,但注意第二个开头不能省略,因为不能在中间断开,然后对ABC再进行操作
第三种:看结尾
样例C A B A B
其实第二种与第三种相同,看结尾就是倒着来,从开始B!=A,然后AB==AB,所以最后这个尾AB(id=34)就可以省略,剩下CAB _ _(下划线为省去的部分),然后再进行操作
我们进行的顺序是第一种到第二再到第三,每次再进行操作时都要从第一种开始
在操作中我们需要截取字符串,就可以用substr(x,y),从第id=x位开始截取,长度为y
但这题还有一个坑,方案数(用ans表示)开始必须为1,(就是他本身,表示不变换),但是应该输出变化后的方案,所以还要-1
对了每个出现的字符串都记录长度,下次遇见时直接返回值

#include<bits/stdc++.h>
const int mod=2014;
using namespace std;
map<string,int>a;string find(string s,int x,int y)
{
//	cout<<6<<" "<<s.substr(x,y)<<endl;return  s.substr(x,y);
}
int count(string s)
{//	cout<<4<<" "<<s<<endl;if(a[s])return a[s];//	cout<<5<<" "<<s<<endl;int ans=1;int len=s.size();for(int i=1;i*2<len;i++){if(find(s,0,i)==find(s,len-i,i)){ans=ans+count(find(s,i,len-i))+count(find(s,0,len-i));//		cout<<1<<" "<<s.substr(i,len-i)<<" "<<s.substr(0,len-i)<<endl;//	cout<<7<<" "<<ans<<endl;}if(find(s,0,i)==find(s,i,i)){ans=ans+count(find(s,i,len-i));//	cout<<2<<" "<<s.substr(i,len-i)<<endl;//		cout<<7<<" "<<ans<<endl;}if(find(s,len-i,i)==find(s,len-i-i,i)){ans+=count(find(s,0,len-i)); //	cout<<3<<" "<<s.substr(0,len-i)<<endl;//	cout<<7<<" "<<ans<<endl;} }
//	cout<<7<<" "<<ans<<endl;a[s]=ans%mod;return a[s];
}
int main()
{string c;cin>>c;int sum =0;sum =(count(c))%mod;cout<<sum-1;return 0;}
//AAAAAAAAAAAAAAAAAAAA

代码中注释部分为我一开始用来调试的,因为一开始我将ans定义为全局变量而被疯狂卡o(╥﹏╥)o
**

题二:

**
链接:https://ac.nowcoder.com/acm/contest/4860/J
来源:牛客网

输入描述:

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

输出描述:

  • Line 1: The number of different ways FJ could have produced this
    string by applying one or more successive operations to some
    source string of length at least 2. If there are no such ways,
    output zero.
    示例1
    输入
ABABA

输出

6

说明

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
    题解:
    (我一开始以为两个一样直接提交代码,痛wa两次)
    题二也就是题一变形,不同处在于:
    一次对字符串S的“操作”是指去掉S开头的一个字母(而非原本的若干)或末尾的一个字母(而非若干),
    看样例:
    ABABA
    也就是ABAB和BABA这两种情况不存在,因为只能删去一个的话,删后字符串长为3,再加上原本的4=7超过了目标长度5
    我们设满足条件的字符串长度为x,目标字符串长度为len,那么删后为x-1,加在一起就是2x-1,要求2x-1<=n
    解得x<=(n+1)/2
    在代码中我们每次所截代码长度为len-i(详细看上个代码),所以len-i>(n+1)/2时就不满足题意,continue,不理这种情况,直接下一个。
#include<bits/stdc++.h>
//const int mod=2014;
using namespace std;
map<string,long long int>a;string find(string s,int x,int y)
{
//	cout<<6<<" "<<s.substr(x,y)<<endl;return  s.substr(x,y);
}
long long int count(string s)
{//	cout<<4<<" "<<s<<endl;if(a[s])return a[s];//	cout<<5<<" "<<s<<endl;long long int ans=1;long long int len=s.size();for(int i=1;i*2<len;i++){if((len-i)>(len+1)/2)continue;//不同之处if(find(s,0,i)==find(s,len-i,i)){ans=ans+count(find(s,i,len-i))+count(find(s,0,len-i));//			cout<<1<<" "<<s.substr(i,len-i)<<" "<<s.substr(0,len-i)<<endl;//		cout<<7<<" "<<ans<<endl;}if(find(s,0,i)==find(s,i,i)){ans=ans+count(find(s,i,len-i));//			cout<<2<<" "<<s.substr(i,len-i)<<endl;//				cout<<7<<" "<<ans<<endl;}if(find(s,len-i,i)==find(s,len-i-i,i)){ans+=count(find(s,0,len-i)); //			cout<<3<<" "<<s.substr(0,len-i)<<endl;//				cout<<7<<" "<<ans<<endl;} }
//	cout<<7<<" "<<ans<<endl;a[s]=ans;return a[s];
}
int main()
{string c;cin>>c;long long int sum =0;sum =count(c);cout<<sum-1;return 0;}
//AAAAAAAAAAAAAAAAAAAA

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320495.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round #520 (Div. 2)

Codeforces Round #520 (Div. 2) D. Fun with Integers 题意&#xff1a;a与b之间有边&#xff0c;当且仅当存在一个\(x\)使得\(a*b x\)或 \(a*x b\)&#xff0c;这条边的边权为\(|x|\)&#xff0c;保证\(|a|,|b|,|x|<n\)&#xff0c;问一条最长的不走重复边的路径的长度是…

稳定工作和创业之间的抉择

早上写的文章《回顾4180天在腾讯使用C#的历程&#xff0c;开启新的征途》是我在腾讯写的最后一篇对过往10年在腾讯使用C#语言的总结&#xff0c;今天收到反馈有人在造谣腾讯开始去.net&#xff0c;我被迫辞职了。这非常的不负责任&#xff0c;我必须写这篇文章来辟谣。要说腾讯…

初二模拟赛总结(2019.8.7)

成绩&#xff1a; rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111hkyhkyhky180180180100100100808080000000222lyflyflyf170170170100100100707070000000333tjhtjhtjh160160160100100100404040000202020444fyfyfy160160160606060100100100000000555cyzcy…

牛客2020年愚人节比赛

欢乐的一晚上 题目链接 其实做做也挺好&#xff0c;脑筋急转弯&#xff0c;不需要算法不需要数据结构&#xff0c;纯娱乐 还有不知道是哪位哥的&#xff0c;心疼一下 题解 注&#xff1a;一下题解没必要较劲&#xff0c;欢乐局而已 对不对无所谓&#xff0c;换了最重要奥 A题ra…

P4655-[CEOI2017]Building Bridges【斜率优化dp,CDQ分治】

正题 题目链接:https://www.luogu.com.cn/problem/P4655 题目大意 nnn座桥&#xff0c;删除第iii座会产生wiw_iwi​的代价&#xff0c;相邻的两座桥i,ji,ji,j会产生(hi−hj)2(h_i-h_j)^2(hi​−hj​)2的代价&#xff0c;要求代价最小。 解题思路 设fif_ifi​表示留到第iii座桥…

Codefroces1077F2. Pictures with Kittens (hard version)

Codefroces1077F2. Pictures with Kittens (hard version) 做法&#xff1a;裸的单调队列优化dp #include <bits/stdc.h> #define P pair<ll,ll> #define fr first #define sc second typedef long long ll; using namespace std; int n, m, x; ll dp[5002][5002],…

IdentityServer4 知多少

1. 引言现在的应用开发层出不穷&#xff0c;基于浏览器的网页应用&#xff0c;基于微信的公众号、小程序&#xff0c;基于IOS、Android的App&#xff0c;基于Windows系统的桌面应用和UWP应用等等&#xff0c;这么多种类的应用&#xff0c;就给应用的开发带来的挑战&#xff0c;…

【线段树】矮人排队(jzoj(gz) 3236)

矮人排队 jzoj &#xff08;gz&#xff09;3236 题目大意&#xff1a; 有n个人&#xff0c;高度分别为1,2……n&#xff08;高度按输入来看&#xff09;&#xff0c;现在有两种操作 1&#xff1a;把第x个人和第y个人换一下 2&#xff1a;询问高度为A&#xff0c;A1……B这B-…

牛客网【每日一题】4月2日 月月查华华的手机

牛客网链接 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 月月和华华一起去吃饭了。期间华华有事出去了一会儿&#xff0c;没有带手机。月月出于人类最单纯的好奇心&#…

P3466-[POI2008]KLO-Building blocks【Treap】

正题 题目链接:https://www.luogu.com.cn/problem/P3466 题目大意 nnn个数&#xff0c;每次可以让一个111或−1-1−1&#xff0c;要求操作次数最少使得有连续kkk个相同的。 解题思路 枚举是哪kkk个&#xff0c;然后用平衡树&#xff08;或对顶堆&#xff09;维护中位数和比中…

Codeforces1080F. Katya and Segments Sets

Codeforces1080F. Katya and Segments Sets 题意&#xff1a;给定n个集合&#xff0c;每个集合里有一些区间\([l_i,r_i]\)&#xff0c;有m次询问&#xff0c;每次询问区间\([x,y]\)中&#xff0c;是否包含了集合a到集合b中每个集合至少一个区间。 做法&#xff1a;按区间右端点…

【二分】Best Cow Fences(poj 2018)

Best Cow Fences poj 2018 题目大意&#xff1a; 给出一个正整数数列&#xff0c;要你求平均数最大&#xff0c;长度不小于M的字串&#xff0c;结果乘1000取整 输入样例 10 6 6 4 2 10 3 8 5 9 4 1输出样例 6500数据范围 1⩽N⩽100,0001\leqslant N \leqslant 100,0001⩽…

离散哈特莱变换(DHT)及快速哈特莱变换(FHT)学习

离散哈特莱变换(DHT)及快速哈特莱变换(FHT)学习 说在前边 最近复习\(DSP\)的时候&#xff0c;发现了一个号称专门针对离散实序列的变换&#xff0c;经分析总运算量为普通\(FFT\)的几乎一半&#xff0c;而且完全没有复数。这么强的吗&#xff1f;于是花了一个下午&#xff0c;去…

P2495-[SDOI2011]消耗战【虚树,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P2495 题目大意 nnn个点的一棵树&#xff0c;mmm次给出一些点&#xff0c;要求割掉最小权值的边使得这些点不和111号点联通。 解题思路 根据这些给出的点构造一棵虚树&#xff0c;然后直接dpdpdp求解即可。 codecodecode #i…

【贪心】Sunscreen(poj 3614/luogu 2887)

Sunscreen poj 3614 luogu 2887 题目大意&#xff1a; 有n个人&#xff0c;每个人要求选一个价值在minniminn_iminni​到maxximaxx_imaxxi​的物品&#xff0c;现在有m件物品&#xff0c;每件的价值是spfispf_ispfi​&#xff0c;可以选covericover_icoveri​次&#xff0c…

.NET Core 2.1中的分层编译(预览)

如果您是.NET性能的粉丝&#xff0c;最近有很多好消息&#xff0c;例如.NET Core 2.1中的性能改进和宣布.NET Core 2.1&#xff0c;但我们还有更多的好消息。分层编译是一项重要的新特性功能&#xff0c;我们可以作为预览供任何人试用&#xff0c;从.NET Core 2.1开始。在我们测…

Codeforces 刷题记录(已停更)

Codeforces 每日刷题记录 (已停更) 打‘’是一些有启发意义的题目&#xff0c;部分附上一句话题解&#xff0c;每日更新3题&#xff0c;大部分题目较水。 DayIDProblemTutorialNote11CF1073E状压&#xff0c;数位dp&#xff0c;官方题解std骚操作\(~\)2CF1072A\(~\)3CF1072B24C…

牛客练习赛60 ~ 斩杀线计算大师

题目传送 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K Special Judge, 64bit IO Format: %lld 题目描述 算术能力是每个炉石玩家必不可少的&#xff0c;假设现在有三种伤害卡&#xff0c;伤害值分别是a,b…

【贪心】Stall Reservations(luogu 2859/poj 3190)

Stall Reservations luogu 2859 poj 3190 题目大意&#xff1a; 有n头牛&#xff0c;每头牛都有自己的挤奶时间&#xff0c;挤奶时间内每头牛用一个奶棚&#xff0c;现在问最少需要多少个奶棚 输入样例 5 1 10 2 4 3 6 5 8 4 7输出样例 4 1 2 3 2 4数据范围 1⩽N⩽50,00…

选择IT事业,意味着终身学习

八月&#xff0c;炎阳如火。 前几天书记找我交流&#xff0c;问我离职的原因&#xff0c;我跟他仔细的分析了一下我的职业发展规划和我对于未来的预期&#xff0c;书记也向我分析了一下他所认为的原因&#xff0c;他说&#xff0c;无外乎是三个原因&#xff1a;第一个是钱的问…