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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

洛谷P2463 Sandy的卡片【后缀数组】【二分】

發布時間:2023/12/9 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷P2463 Sandy的卡片【后缀数组】【二分】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

Sandy和Sue的熱衷于收集干脆面中的卡片。

然而,Sue收集卡片是因為卡片上漂亮的人物形象,而Sandy則是為了積攢卡片兌換超炫的人物模型。

每一張卡片都由一些數字進行標記,第i張卡片的序列長度為Mi,要想兌換人物模型,首先必須要集夠N張卡片,對于這N張卡片,如果他們都有一個相同的子串長度為k,則可以兌換一個等級為k的人物模型。相同的定義為:兩個子串長度相同且一個串的全部元素加上一個數就會變成另一個串。

Sandy的卡片數遠遠小于要求的N,于是Sue決定在Sandy的生日將自己的卡片送給Sandy,在Sue的幫助下,Sandy終于集夠了N張卡片,但是,Sandy并不清楚他可以兌換到哪個等級的人物模型,現在,請你幫助Sandy和Sue,看看他們最高能夠得到哪個等級的人物模型。

輸入輸出格式

輸入格式:

?

第一行為一個數N,表示可以兌換人物模型最少需要的卡片數,即Sandy現在有的卡片數

第i+1行到第i+N行每行第一個數為第i張卡片序列的長度Mi,之后j+1到j+1+Mi個數,用空格分隔,分別表示序列中的第j個數

?

輸出格式:

?

一個數k,表示可以獲得的最高等級。

?

輸入輸出樣例

輸入樣例#1:?復制 2 2 1 2 3 4 5 9 輸出樣例#1:?復制 2

說明

數據范圍:

30%的數據保證n<=50

100%的數據保證n<=1000,M<=1000,2<=Mi<=101

?

題意:

給定幾串序列,問他們最長公共子序列是多長。

思路:

類似之前做的Muisical, Themehttps://www.cnblogs.com/wyboooo/p/9865919.html

都是可以通過增加一個定值,所以只需要處理間隔。

不同的地方在于這個題目是多個不同的串。可以想到的是,是不是可以將這些串拼接起來。

拼起來就需要考慮一個問題,找到的這個串應該要避免他們跨越了拼接的那個間隔。

所以首先我們應該要用一個原來的串中從來沒有出現過的字符來分隔兩個串。

其次,當我們二分尋找答案的時候,應該要考慮我們找到的這個區間,他們表示的后綴的首字母也就是sa[i],是不是分別屬于n個串。

所以我們要標好每個位置屬于哪個串。

1 #include <iostream> 2 #include <set> 3 #include <cmath> 4 #include <stdio.h> 5 #include <cstring> 6 #include <algorithm> 7 #include <vector> 8 #include <queue> 9 #include <map> 10 using namespace std; 11 typedef long long LL; 12 #define inf 0x7f7f7f7f 13 14 const int maxn = 1005; 15 int a[maxn][maxn], s[maxn * maxn], s_len[maxn], id[maxn * maxn], vis[maxn]; 16 int sa[maxn * maxn]; 17 int t1[maxn * maxn], t2[maxn * maxn], c[maxn * maxn]; 18 int rnk[maxn * maxn], height[maxn * maxn]; 19 int n, len; 20 21 void build_sa(int s[], int n, int m) 22 { 23 int i, j, p, *x = t1, *y = t2; 24 for(i = 0; i < m; i++)c[i] = 0; 25 for(i = 0; i < n; i++)c[x[i] = s[i]]++; 26 for(i = 1; i < m; i++)c[i] += c[i - 1]; 27 for(i = n - 1; i >= 0; i--)sa[--c[x[i]]] = i; 28 for(j = 1; j <= n; j <<= 1){ 29 p = 0; 30 for(i = n - j; i < n; i++)y[p++] = i; 31 for(i = 0; i < n; i++)if(sa[i] >= j)y[p++] = sa[i] - j; 32 for(i = 0; i < m; i++)c[i] = 0; 33 for(i = 0; i < n; i++)c[x[y[i]]]++; 34 for(i = 1; i < m; i++)c[i] += c[i - 1]; 35 for(i = n - 1; i >= 0; i--)sa[--c[x[y[i]]]] = y[i]; 36 swap(x, y); 37 p = 1; 38 x[sa[0]] = 0; 39 for(i = 1; i < n; i++){ 40 x[sa[i]] = y[sa[i - 1]] == y[sa[i]] && y[sa[i - 1] + j] == y[sa[i] + j] ? p - 1 : p++; 41 } 42 if(p >= n)break; 43 m = p; 44 } 45 } 46 47 void get_height(int s[], int n) 48 { 49 int i, j, k = 0; 50 for(i = 0; i <= n; i++)rnk[sa[i]] = i; 51 for(i = 1; i <= n; i++){ 52 if(k)k--; 53 j = sa[rnk[i] - 1]; 54 while(s[i + k] == s[j + k])k++; 55 height[rnk[i]] = k; 56 } 57 } 58 int sta[maxn * maxn], top; 59 bool check(int mid) 60 { 61 while(top)vis[sta[top--]] = false; 62 for(int i = 1; i <= len; i++){ 63 if(height[i] < mid){ 64 while(top)vis[sta[top--]] = false; 65 } 66 if(!vis[id[sa[i]]]){ 67 vis[id[sa[i]]] = true; 68 sta[++top] = id[sa[i]]; 69 if(top == n)return true; 70 } 71 } 72 return false; 73 } 74 75 int main() 76 { 77 scanf("%d", &n); 78 len = 0; 79 int mmx = -1; 80 for(int i = 1; i <= n; i++){ 81 vis[i] = false; 82 scanf("%d", &s_len[i]); 83 for(int j = 1; j <= s_len[i]; j++){ 84 scanf("%d", &a[i][j]); 85 if(j)mmx = max(mmx, a[i][j] - a[i][j - 1]); 86 } 87 } 88 int mmin = inf; 89 for(int i = 1; i <= n; i++){ 90 for(int j = 2; j <= s_len[i]; j++){ 91 s[++len] = a[i][j] - a[i][j - 1]; 92 id[len] = i; 93 mmin = min(mmin, s[len]); 94 } 95 s[++len] = ++mmx; 96 } 97 for(int i = 1; i <= len; i++){ 98 s[i] = s[i] - mmin + 1; 99 //cout<<s[i]<<endl; 100 } 101 102 build_sa(s, len + 1, 2000); 103 /*for(int i = 1; i <= len; i++){ 104 cout<<sa[i]<<endl; 105 }*/ 106 get_height(s, len); 107 /*cout<<len<<endl; 108 for(int i = 2; i <= len; i++){ 109 cout<<height[i]<<endl; 110 }*/ 111 //cout<<len<<endl; 112 int st = 0, ed = len, ans = -1; 113 while(st <= ed){ 114 int mid = (st + ed) / 2; 115 if(check(mid)){ 116 st = mid + 1; 117 ans = mid; 118 } 119 else{ 120 ed = mid - 1; 121 } 122 } 123 124 printf("%d\n", ans + 1); 125 return 0; 126 }

?

轉載于:https://www.cnblogs.com/wyboooo/p/9876295.html

總結

以上是生活随笔為你收集整理的洛谷P2463 Sandy的卡片【后缀数组】【二分】的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 一级黄色免费视频 | 亚洲一区二区久久 | 高清一区二区三区视频 | 夜夜夜久久久 | 内射后入在线观看一区 | av夜色| 亚洲综合色站 | 爱情岛论坛永久入口 | av网址观看 | 久久久资源网 | 7777在线视频 | 9191国产精品| 美女干b视频 | 日本成人一区二区 | 日本大尺度电影免费观看全集中文版 | 久久老熟女一区二区三区 | 国产精品一区二区三区在线 | 一区二区男女 | 色久在线 | 欧美麻豆 | 日韩视频一区二区三区四区 | 乳女教师の诱惑julia | 婷婷天堂 | 国产永久毛片 | 我要看黄色大片 | 天天躁日日躁狠狠躁av | 蜜桃成人无码区免费视频网站 | 日本三级大全 | 免费看黄色一级大片 | 伊人免费视频二 | 亚洲va欧美va天堂v国产综合 | 内射一区二区三区 | 超碰免费在线97 | 亚洲一区免费视频 | 最新亚洲精品 | 夜夜草天天草 | 狠狠干超碰 | 修女也疯狂3免费观看完整版 | www.狠狠操.com | 在线一区二区三区 | 黄色在线不卡 | 欧美污视频 | 中文字幕一区二区三区不卡 | 中文字幕一区二区三区乱码不卡 | 欧美一级艳片视频免费观看 | 超碰2025| 国产青青草视频 | 精品久久精品久久 | 在线观看av中文字幕 | 国产crm系统91在线 | 日本黄色网页 | 麻豆久久久久久 | 久久黄色av | 91手机视频 | 久久久久久久黄色 | 午夜激情毛片 | 日韩精品一区二区三区四区 | 国内精品卡一卡二卡三 | 国产区精品在线观看 | 欧美熟妇乱码在线一区 | 久久久精品日韩 | 亚洲国产97在线精品一区 | 日本一区二区三区成人 | 欧美在线播放一区 | 日韩中文字幕不卡 | 97在线观看| 不卡在线播放 | 久久久精品毛片 | 91本色| 中文字幕高潮 | 国产偷国产偷av亚洲清高 | 国产精品秘入口18禁麻豆免会员 | 国产免费自拍 | 亚洲一区二区偷拍 | 亚洲福利av | 婷婷精品进入 | 91桃色视频在线观看 | 天堂无乱码 | 不卡的av在线| 黑人玩弄人妻一区二区三区免费看 | 四季av国产一区二区三区 | 日本xxxx18高清hd | 涩涩视频在线观看免费 | 久久久久久久九九九九 | 人妻少妇一区二区三区 | 黄色aa毛片| 91性生活| 国产精品一区二区久久国产 | 91福利社在线观看 | 女人的天堂av | 中文字幕一区二区三区人妻四季 | 久久精品无码人妻 | 辟里啪啦国语版免费观看 | 亚洲精品免费在线播放 | 无遮挡黄色 | 欧美日韩视频一区二区三区 | 国产91在线 | 亚洲 | 成人亚洲网站 | 天天操天天干天天摸 |