日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2017校赛 问题 D: 我知道了,你知道了吗?【递归】

發布時間:2025/3/21 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2017校赛 问题 D: 我知道了,你知道了吗?【递归】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

Alice和Bob走在去學校的路上,聽到兩個路人的對話:

路人甲:我知道了, 你知道了嗎?

路人乙:我知道你知道了,你知道了嗎?

路人甲:我知道你知道我知道了,你知道了嗎?

路人乙:我知道你知道我知道你知道了,你知道了嗎?

.........

他們便覺得十分有趣,覺得非常像兩個人在玩字符串拼接的游戲,受此啟發,Alice和Bob玩起了”類似”的拼接游戲:

Alice首先會選擇四個字符串S1, A, B, C,之后Alice和Bob輪流拼接出第2,第3,第4....第n個字符串,對于第i個字符串Si??(i > 1), 它的拼接規則是Si?= A + Si-1?+ B + Si-1?+ C,其中符號“+”是字符串連接的意思,舉個例子:

Alice先選擇了S1?= “ab”, A = “CD”, B = “EF”, C = “GH”,接下來的操作是:

Bob?拼接出?S2?= “CDabEFabGH”

Alice拼接出?S3?= “CDCDabEFabGHEFCDabEFabGHGH”

...........

走在路上的你恰巧看到了Alice和Bob玩游戲的整個過程,Alice就問你,在他們拼出的第n個字符串中的第k個字符是什么?Alice和Bob都已經知道了,你知道了嗎?假設無論多長的字符串Alice和Bob都能拼接出來。

注意引號是定界符,不屬于字符串。

輸入

輸入包括多組數據(數據組數總共不超過50)。

每組第一行有四個字符串,分別是S1, A, B, C(長度都<=100),字符串只包含小寫英文字母和大寫英文字母.

第二行一個整數q(1 <= q <= 50),表示Alice詢問的次數。

接下來有q行, 每組兩個整數n(1 <= n <= 1000)和k(1 <= k <= 100000000),分別代表Alice和Bob拼接出的第n個字符串以及第n個字符串中的第k個字符。

輸出

對于每個n和k,輸出對應的Alice和Bob拼接出的第n個字符串中第k個字符。如果第n個字符串中第k個字符不存在輸出’*’。每個答案獨占一行。

樣例輸入

ab CD EF GH 5 1 1 1 2 1 3 2 10 2 11

樣例輸出

a b * H *

越補題越崩潰,點背加經驗少。。。。
記錄下個人思路:
顯然第n個字符串是個遞推式:

那么我求第n個字符串的第k個字符只需要判斷k的范圍即可,如果k<=len(A),就在A中找相應位置,如果k>len(A)&&k<=len(Sn-1)就遞歸到Sn-1,在Sn-1中找第k-len(A)個位置,以此類推。。。。

所以這道題剛開始我這樣寫:

1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 int ls,la,lb,lc; 8 int s[1006]; 9 char s1[105],A[105],B[105],C[105]; 10 11 void solve(int n,int k) 12 { 13 if(n==1){ 14 printf("%c\n",s1[k-1]); 15 return; 16 } 17 if(k<=la){ 18 printf("%c\n",A[k-1]); 19 return; 20 }else if(k>la+s[n-1]&&k<=la+s[n-1]+lb){ 21 printf("%c\n",B[k-la-s[n-1]-1]); 22 return; 23 }else if(k>la+lb+2*s[n-1]&&k<=la+lb+lc+2*s[n-1]){ 24 printf("%c\n",C[k-la-lb-2*s[n-1]-1]); 25 return; 26 }else if(k>la&&k<=la+s[n-1]){ 27 solve(n-1,k-la); 28 return; 29 }else { 30 solve(n-1,k-la-lb-s[n-1]); 31 return; 32 } 33 } 34 35 int main() 36 { 37 while(scanf("%s%s%s%s",s1,A,B,C)==4) 38 { 39 memset(s,0,sizeof(s)); 40 ls=strlen(s1);la=strlen(A); 41 lb=strlen(B);lc=strlen(C); 42 s[1]=ls; 43 for(int i=2;i<=1001;i++){ 44 s[i]=s[i-1]*2+la+lb+lc; 45 } 46 int q,n,k; 47 scanf("%d",&q); 48 while(q--) 49 { 50 scanf("%d%d",&n,&k); 51 if(k>s[n]) printf("*\n"); 52 else{ 53 solve(n,k); 54 } 55 } 56 } 57 return 0; 58 } 59 錯誤寫法

?顯然,運行錯誤(段錯誤),就是超數組邊界了。后來再想想,len(Sn)=2*len(Sn-1)+len(A)+len(B)+len(C)==>len(Sn)=2^(n-1)len(s1)+(4*n-5)*[len(A)+len(B)+len(C)](大概推了一下,可能有錯誤)。可以看出,字符串的長度是呈指數形式增長的,自然存到n=30數就已經很大很大了,又有k<=10^8,那么也就是說即便S1,A,B,C長度均為1,n==28時已經大于這個數了(2^27約為134217728)。所以當n>=28時長度已經足夠達到k的最大值。所以我只存到n=28,當n>28時根據遞推式推到n<=28的范圍內再用上面的做法解決。

1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 typedef long long ll; 8 ll ls,la,lb,lc; 9 ll s[31]; 10 char s1[105],A[105],B[105],C[105]; 11 12 void solve(int n,int k) 13 { 14 if(n==1){ 15 printf("%c\n",s1[k-1]); 16 return; 17 } 18 if(k<=la){ 19 printf("%c\n",A[k-1]); 20 return; 21 }else if(k>la+s[n-1]&&k<=la+s[n-1]+lb){ 22 printf("%c\n",B[k-la-s[n-1]-1]); 23 return; 24 }else if(k>la+lb+2*s[n-1]&&k<=la+lb+lc+2*s[n-1]){ 25 printf("%c\n",C[k-la-lb-2*s[n-1]-1]); 26 return; 27 }else if(k>la&&k<=la+s[n-1]){ 28 solve(n-1,k-la); 29 return; 30 }else { 31 solve(n-1,k-la-lb-s[n-1]); 32 return; 33 } 34 } 35 36 int main() 37 { 38 while(scanf("%s%s%s%s",s1,A,B,C)==4) 39 { 40 memset(s,0,sizeof(s)); 41 ls=strlen(s1);la=strlen(A); 42 lb=strlen(B);lc=strlen(C); 43 s[1]=ls; 44 for(int i=2;i<=29;i++){ 45 s[i]=s[i-1]*2+la+lb+lc; 46 } 47 int q,n,k; 48 scanf("%d",&q); 49 while(q--) 50 { 51 scanf("%d%d",&n,&k); 52 int pos=1; 53 for(int i=1;i<=28;i++) 54 if(s[i]>=k){ 55 pos=i;break; 56 } 57 if(pos>n) printf("*\n"); 58 else if(n<=28){ 59 solve(n,k); 60 }else { 61 int t=la*(n-28); 62 if(t>=k){ 63 int r=k%la; 64 printf("%c\n",A[r]); 65 }else{ 66 solve(28,k-t); 67 } 68 } 69 } 70 } 71 return 0; 72 }

?

轉載于:https://www.cnblogs.com/zxhyxiao/p/8073758.html

總結

以上是生活随笔為你收集整理的2017校赛 问题 D: 我知道了,你知道了吗?【递归】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91亚洲国产成人精品一区 | 五月激情视频 | 97精品国产97久久久久久免费 | 国产成人精品综合在线观看 | 日韩欧美久久久 | 国产亚洲欧美日韩精品 | 性一交一乱一精一晶 | 亚洲第一成网站 | 最新色视频 | 强伦人妻一区二区三区视频18 | 五月六月婷婷 | 久久综合久久综合久久综合 | 亚洲中文字幕无码专区 | 亚洲不卡在线 | 99热这里只 | 国产成人精品在线观看 | www.操操操 | 国产成人av电影 | 亚洲av无码一区二区三区四区 | 午夜性刺激免费视频 | 在线电影一区二区三区 | 精品国产一区二区三区在线观看 | 日本亚洲色大成网站www久久 | 欧美三级视频 | 日本精品免费视频 | 国产女人精品 | 日韩在线一级 | 黄色大片aaa | xxx国产在线观看 | 午夜精品福利一区二区蜜股av | 日韩国产电影 | 日韩电影中文字幕在线观看 | 欧美亚洲视频在线观看 | 热99在线观看| 九九久久99 | 色七七久久 | 男人透女人免费视频 | 亚洲狠狠婷婷综合久久久久图片 | 日韩va亚洲va欧美va久久 | av电影中文字幕 | 五月天福利视频 | av中文字幕免费 | 韩国成年人网站 | 国产大屁股喷水视频在线观看 | 久久精品国产亚洲av麻豆蜜芽 | 91久久精品夜夜躁日日躁欧美 | caobi视频 | www国产精品视频 | 99久久久 | 中文字幕+乱码+中文字幕明步 | 国产一区二区啪啪啪 | 国产主播福利 | 91传媒理伦片在线观看 | 尹人综合 | 中文字幕亚洲第一 | 国产日韩精品电影 | 91丨九色 | 射黄视频 | 秋霞免费av | 国产日韩激情 | 日本色妞 | 国产精品8 | 免费日韩成人 | 波多野结衣喷潮 | 精品无码人妻一区二区三区品 | 国产三级按摩推拿按摩 | 337p日本大胆噜噜噜噜 | 黄色1级片 | 久久首页 | 国产精品情侣呻吟对白视频 | 福利色播| 欧美日本一区 | 国产精品成人99一区无码 | 一区二区三区网站 | 麻豆免费av | 91在线视频免费观看 | www.久久久久.com | 亚洲成a人v | 日韩在线观看精品 | 一本色道久久88综合日韩精品 | 亚洲精品偷拍 | 日本高清免费视频 | 国产精品成人69xxx免费视频 | 1769国产| 亚洲欧美激情另类校园 | 色涩涩 | 99re只有精品 | 无码人妻丰满熟妇区五十路 | 国产视频二区三区 | 全程偷拍露脸中年夫妇 | 久久精品网址 | 在线视频a | 国产精品影院在线观看 | 精品国产乱码久久久 | 色婷婷导航 | 国产深喉视频一区二区 | 大香蕉视频一区二区 | 波多野在线观看 | 波多野结衣女同 |