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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

JZOJ 3648. 【GDOI2014】beyond

發布時間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JZOJ 3648. 【GDOI2014】beyond 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description


Input

第一行:包含一個整數N。

第二行:包含一個長度為N的字符串,字符串中只包含小寫字母。

第三行:包含一個長度為N的字符串,字符串中只包含小寫字母。

Output

輸出答案只包含一個數字L,表示圓環最大可能有的格子數。

Sample Input

輸入1:

5

abcdx

cdabz

輸入2:

4

abcd

cdab

Sample Output

輸出1:

4

輸出2:

4

Data Constraint

對于20% 的數據,1 <= N <= 5,000

對于50% 的數據,1 <= N <= 600,000

對于100% 的數據,1 <= N <= 2,000,000

Solution

  • 簡化題意:求兩個串前綴的最大循環同構子串的長度。

  • 于是對于兩個串互相各做一遍擴展KMP,求出 Extend 數組。

  • 掃一遍,如果滿足 ext1[ext2[i]+1]i?1 即說明滿足條件(畫圖理解一下)。

  • 時間復雜度 O(N)

Code

#include<cstdio> using namespace std; const int N=2e6+5; int n,ans,mx,id; int next[N],ext1[N],ext2[N]; char s1[N],s2[N]; inline int max(int x,int y) {return x>y?x:y; } inline void exkmp(char *s,char *t,int *ext) {next[1]=n;mx=id=0;for(int i=2;i<=n;i++){int j=next[i-id+1];if(i+j>mx){j=max(mx-i+1,0);while(i+j<=n && t[i+j]==t[j+1]) j++;}next[i]=j;if(i+j-1>mx) mx=i+j-1,id=i;}mx=id=0;for(int i=1;i<=n;i++){int j=next[i-id+1];if(i+j>mx){j=max(mx-i+1,0);while(i+j<=n && s[i+j]==t[j+1]) j++;}ext[i]=j;if(i+j-1>mx) mx=i+j-1,id=i;} } int main() {scanf("%d",&n);scanf("%s",s1+1),scanf("%s",s2+1);exkmp(s1,s2,ext1),exkmp(s2,s1,ext2);for(int i=1;i<=n;i++){int j=ext1[i];if(ext2[j+1]>=i-1) ans=max(ans,i+j-1);}printf("%d",ans);return 0; }

總結

以上是生活随笔為你收集整理的JZOJ 3648. 【GDOI2014】beyond的全部內容,希望文章能夠幫你解決所遇到的問題。

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