51nod除了在做oj之外,還開展了很多副業。婚姻介紹所就是其中之一。
對於乙個客戶,我們可以使用乙個字串來描述該客戶的特質。
假設現在我們有兩個客戶a和b。
a的特質字串為:abcdefg
b的特質字串為:abcxyz
則a和b的匹配度f(a, b)為a和b的最長公共字首的長度,即len(『abc』) = 3
由於最近51nod經費緊張,所以夾克大老爺設計了一種壓縮演算法以節約記憶體。
所有使用者的特質字串都被儲存在了乙個長為n的字串s中。(n <= 1000)使用者的特質使用乙個整數p表示,表示該使用者的特質字串為s[p…n - 1]。
現給定字串s,與q次查詢(ai, bi分別為合法的使用者特質整數)。請輸出q次查詢分別對應的客戶匹配度。
現給定字串長度n,與字串s。接下來是整數q,代表接下來有q次查詢。
下面q行有兩個整數ai, bi。代表查詢特質為ai與bi的使用者的匹配度。
1 <= n <= 1000
1 <= q <= 10^6
輸入資料全部合法。
每一行輸出乙個使用者匹配度整數。
題意:求給定x位置的字尾與y位置的字尾的最長公共字首
思路:字尾x和字尾y的最長公共字首
min(height[rak[x]+1], height[rak[x] + 2]…height[rak[y]])
使用rmq預處理出height陣列,然後o(1)時間複雜度查詢最長公共字首
#include
using
namespace std;
const
int maxn =
1e6+5;
char s[maxn]
;struct node a[maxn]
, b[maxn]
;int n, m, p;
int sa[maxn]
, rak[maxn]
, tx[maxn]
;int lg[maxn]
;void
rsort()
for(
int i =
1; i <= n; i++
)for
(int i =
1; i <= m; i++
)for
(int i =
1; i <= n; i++
)for
(int i =
1; i <= m; i++
)for
(int i =
1; i <= n; i++
)for
(int i =
1; i <= m; i++
)for
(int i = n; i >=
1; i--)}
void
solve()
else
}for
(int i =
1; i <= n; i++
) m = p;
}void
ssort()
solve()
;for
(int j =
1; j <= n; j <<=1)
solve()
;if(p == n)}}
int height[maxn]
;inline
void
get_height()
}int dp[maxn][20
];void
rmq(
)for
(int j =
1; j <= lg[n]
; j++)}
}inline
intread()
while
(ch>=
'0'&&ch<=
'9')
return k*f;
}int
main()
else
l++;int k = lg[r - l +1]
;printf
("%d\n"
,min
(dp[l]
[k], dp[r -(1
<< k)+1
][k]))
;}}return0;
}
51nod 1732 51nod婚姻介紹所
51nod除了在做oj之外,還開展了很多副業。婚姻介紹所就是其中之一。對於乙個客戶,我們可以使用乙個字串來描述該客戶的特質。假設現在我們有兩個客戶a和b。a的特質字串為 abcdefg b的特質字串為 abcxyz 則a和b的匹配度f a,b 為a和b的最長公共字首的長度,即len abc 3 由於...
51Nod 1732 51nod婚姻介紹所
1732 51nod婚姻介紹所 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 51nod除了在做oj之外,還開展了很多副業。婚姻介紹所就是其中之一。對於乙個客戶,我們可以使用乙個字串來描述該客戶的特質。假設現在我們有兩個客戶a和b。a的特質字串為 abcdefg...
51nod 1732 51nod婚姻介紹所
1732 51nod婚姻介紹所 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 51nod除了在做oj之外,還開展了很多副業。婚姻介紹所就是其中之一。對於乙個客戶,我們可以使用乙個字串來描述該客戶的特質。假設現在我們有兩個客戶a和b。a的特質字串為 abcdefg...