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
輸入
輸出
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
對了每個出現的字符串都記錄長度,下次遇見時直接返回值
代碼中注釋部分為我一開始用來調試的,因為一開始我將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
輸入
輸出
6說明
Here are the different ways FJ could have produced ABABA:
題解:
(我一開始以為兩個一樣直接提交代碼,痛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,不理這種情況,直接下一個。
總結
以上是生活随笔為你收集整理的Secret Code(原题和变形题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信历史消息怎么做出微站(微信 历史消息
- 下一篇: 牛客2020年愚人节比赛