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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

CF1131E String Multiplication(???)

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

這題難度2200,應(yīng)該值了。

題目鏈接:CF原網(wǎng)

題目大意:定義兩個(gè)字符串 $s$ 和 $t$($s$ 的長(zhǎng)度為 $m$)的乘積為 $t+s_1+t+s_2+\dots+t+s_m+t$。定義一個(gè)字符串的美麗度為最長(zhǎng)的相同字母連續(xù)子序列的長(zhǎng)度。現(xiàn)在給出 $n$ 個(gè)字符串 $p_i$,問(wèn) $((p_1p_2)p_3)\dots p_n$ 的美麗度。

$1\le n\le 10^5,\sum|p_i|\le 10^5$。


官方題解講的很復(fù)雜,但看起來(lái)也就是個(gè)暴力大模擬,跟我的做法差不多。

為敘述方便,令 $P_i=((p_1p_2)p_3)\dots p_i$。

我們現(xiàn)在考慮如何從 $P_{i-1}$ 轉(zhuǎn)移到 $P_i$。

對(duì)于每個(gè) $P_i$,我們維護(hù) $s[i][c]$ 表示 $P_i$ 中最長(zhǎng)的連續(xù) $c$ 的長(zhǎng)度。

先不考慮乘法,將 $s[i][c]$ 設(shè)為 $p_i$ 中的連續(xù)長(zhǎng)度。

定義 $lc$ 為 $p_i$ 最長(zhǎng)的連續(xù)字母前綴,$rc$ 為最長(zhǎng)的連續(xù)字母后綴。

首先如果 $p_i$ 的首尾字母不相同,那么 $s[i][{p_i}_1]$ 就可以從 $lc+[P_{i-1}\text{中出現(xiàn)過(guò)}{p_i}_1]$ 更新(接在原來(lái)字符的后面組成)。$s[i][{p_i}_{|p_i|}]$ 同理。

否則如果 $p_i$ 不由相同字母構(gòu)成,那么:

  • 如果 $P_i$ 中出現(xiàn)過(guò) ${p_i}_1$,$s[i][{p_i}_1]$ 就可以從 $lc+rc+1$ 更新。(前綴接在這個(gè)字符后面,前一個(gè)后綴接在這個(gè)字符前面)
  • 否則,$s[i][{p_i}_1]$ 就可以從 $\max(lc,rc)$ 更新,這不會(huì)更優(yōu),可以省略。

否則,就可以把 $s[i-1][{p_i}_1]$ 個(gè) ${p_i}_1$ 拿出來(lái),前后接上 $p_i$,那么 $s[i][{p_i}_1]$ 就可以從 $|p_i|(s[i-1][{p_i}_1]+1)+s[i-1][{p_i}_1]$ 更新。

注意最后 $P_{i-1}$ 會(huì)被拆成一個(gè)個(gè)字符,他們對(duì) $s[i]$ 的貢獻(xiàn)就是每個(gè)字符有沒(méi)有出現(xiàn)過(guò),而不是出現(xiàn)次數(shù)。

最后所有 $s[n][c]$ 的最大值就是答案。

時(shí)間復(fù)雜度 $O(\sum |p_i|)$。

#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> PII; const int maxn=100010; #define MP make_pair #define PB push_back #define lson o<<1,l,mid #define rson o<<1|1,mid+1,r #define FOR(i,a,b) for(int i=(a);i<=(b);i++) #define ROF(i,a,b) for(int i=(a);i>=(b);i--) #define MEM(x,v) memset(x,v,sizeof(x)) inline int read(){char ch=getchar();int x=0,f=0;while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return f?-x:x; } int n,cont[100010][26],s[26]; char str[maxn]; inline void chkmax(int &x,int y){if(y>x) x=y; } int main(){n=read();FOR(nn,1,n){scanf("%s",str+1);int len=strlen(str+1);int cnt=1;FOR(i,1,len)if(str[i]!=str[i+1]){chkmax(cont[nn][str[i]-'a'],cnt);cnt=1;}else cnt++;int lcnt=1,rcnt=1;FOR(i,2,len){if(str[i]==str[1]) lcnt++;else break;}ROF(i,len-1,1){if(str[i]==str[len]) rcnt++;else break;}if(nn!=1){if(lcnt==len && rcnt==len) chkmax(cont[nn][str[1]-'a'],len*(cont[nn-1][str[1]-'a']+1)+cont[nn-1][str[1]-'a']);else if(str[1]==str[len]){if(cont[nn-1][str[1]-'a']) chkmax(cont[nn][str[1]-'a'],lcnt+rcnt+1);}else{chkmax(cont[nn][str[1]-'a'],lcnt+!!cont[nn-1][str[1]-'a']);chkmax(cont[nn][str[len]-'a'],rcnt+!!cont[nn-1][str[len]-'a']);}}FOR(i,0,25) chkmax(cont[nn][i],!!cont[nn-1][i]);}int res=0;FOR(i,0,25) res=max(res,cont[n][i]);printf("%d\n",res); } View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/1000Suns/p/10424675.html

總結(jié)

以上是生活随笔為你收集整理的CF1131E String Multiplication(???)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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