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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Count The Repetitions

發(fā)布時(shí)間:2025/3/8 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Count The Repetitions 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Count The Repetitions

定義\(conn(s,n)\)為字符串s重復(fù)n次形成的新字符串,定義字符串a(chǎn)能被字符串b生成,當(dāng)且僅當(dāng)a是b的子串,現(xiàn)在給出s1,n1,s2,n2,求最大的m使\(conn(conn(s2,n2),m)\)能被\(conn(s1,n1)\)生成,\(s_1\)\(s_2\) 長度不超過100,\(n_1\)\(n_2\) 不大于 \(10^6\)

首先\(conn(conn(s2,n2),m)=conn(s2,n2\times m)\),于是可以令\(m'=n2\times m\),現(xiàn)在只要求出最大的m即可。

注意到字符串為循環(huán)節(jié),循環(huán)節(jié),模數(shù)是倍增的大展身手之處,于是我們可以設(shè)\(f[i][j]\)表示s1中的第i個(gè)位置開始至少要多少個(gè)字符,形成\(2^j\)個(gè)s2,當(dāng)j=0,可以\(n^2\)枚舉,注意判斷無解的情況,而且如果一個(gè)地方有解的話,每個(gè)地方都會(huì)有數(shù)值。

因此不難有

\(f[i][j]=f[i][j-1]+f[i+f[i][j-1]][j-1]\)

維護(hù)好了倍增數(shù)組,接下來二進(jìn)制拆分考慮問題,s1存在范圍,故從大的次冪到小枚舉,并保證不超過\(s1.size()\times n1\)的前提下,盡可能讓m大,輸出\(n/n2\)即可。

參考代碼:

#include <iostream> #include <cstdio> #include <cstring> #define il inline #define ri register #define ll long long using namespace std; string s1,s2; int len1,len2; ll dp[150][28]; il void work(int,int); int main(){int n1,n2;while(cin>>s2>>n2>>s1>>n1)work(n1,n2);return 0; } il void work(int n1,int n2){memset(dp,0,sizeof(dp));int li((ll)n1*s1.size()),m(0);for(int i(0),j,k,tot;i<s1.size();++i)for(j=0,k=i;j<s2.size();++j){tot=0;while(s1[k]!=s2[j]&&tot<=s1.size())(++k)%=s1.size(),++tot;if(tot>s1.size())return (void)(puts("0"));dp[i][0]+=tot+1,(++k)%=s1.size();}for(int j(1),i;j<28;++j)for(i=0;i<s1.size();++i)dp[i][j]=dp[i][j-1]+dp[(i+dp[i][j-1])%s1.size()][j-1];for(int i(27),j(0);i>=0;--i)if(dp[j][i]<=li)li-=dp[j][i],m+=1<<i,(j+=dp[j][i])%=s1.size();printf("%d\n",m/n2); }

轉(zhuǎn)載于:https://www.cnblogs.com/a1b3c7d9/p/10954675.html

總結(jié)

以上是生活随笔為你收集整理的Count The Repetitions的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。