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

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

生活随笔

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

编程问答

加强版[BZOJ#3483] SGU505 Prefixes and suffixes(询问在线版)

發(fā)布時(shí)間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 加强版[BZOJ#3483] SGU505 Prefixes and suffixes(询问在线版) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • description
  • solution
  • code

#3483. SGU505 Prefixes and suffixes(詢問(wèn)在線版)

description

給定𝑛個(gè)字符串,有𝑚個(gè)詢問(wèn)。
每個(gè)詢問(wèn)給出兩個(gè)字符串𝑠1, 𝑠2,問(wèn)𝑛個(gè)字符串中有多少個(gè)字符串滿足𝑠1是其前綴,且𝑠2是其后綴。

輸入格式
從文件 fix.in 中讀入數(shù)據(jù)。
輸入文件的第一行包含一個(gè)整數(shù)𝑛,含義如上所述。
接下來(lái)𝑛行,每行一個(gè)字符串。
接下來(lái)一行包含一個(gè)整數(shù)𝑚,代表詢問(wèn)數(shù)。
接下來(lái)𝑚行,每行包含兩個(gè)字符串𝑠1, 𝑠2,代表一次詢問(wèn)。詢問(wèn)內(nèi)容請(qǐng)參見(jiàn)問(wèn)題描述。
為了體現(xiàn)算法的在線性,我們令上次詢問(wèn)的答案是𝑥(如果這是第一個(gè)詢問(wèn)則𝑥 = 0)。詢問(wèn)的兩個(gè)字符串的所有字符都要按字母表的順序向后移動(dòng)𝑥位(字母表是一個(gè)環(huán))。例如 x=2,輸入的 s1=qz 則查詢的 s1=sb。

輸出格式
輸出到 fix.out 中。
對(duì)于每次詢問(wèn),輸出串滿足既是𝑠1的前綴,又是𝑠2的后綴的字符串的數(shù)量。

樣例輸入

10 emikuqihgokuhsywlmqemihhpgijkxdukjfmlqlwrpzgwrwozkmlixyxniutssasrriafu emikuqihgokuookbqaaoyiorpfdetaeduogebnolonaoehthfaypbeiutssasrriafu emikuqihgokuorocifwwymkcyqevdtglszfzgycbgnpomvlzppwrigowekufjwiiaxniutssasrriafu emikuqihgokuorociysgfkzpgnotajcfjctjqgjeeiheqrepbpakmlixyxniutssasrriafu emikuqihgokuorociysgfrhulymdxsqirjrfbngwszuyibuixyxniutssasrriafu emikuqihgokuorguowwiozcgjetmyokqdrqxzigohiutssasrriafu emikuqihgokuorociysgsczejjmlbwhandxqwknutzgdmxtiutssasrriafu emikuqihgokuorociysgvzfcdxdiwdztolopdnboxfvqzfzxtpecxcbrklvtyxniutssasrriafu emikuqihgokuorocsbtlyuosppxuzkjafbhsayenxsdmkmlixyxniutssasrriafu emikuqihgokuorociysgfjvaikktsixmhaasbvnsvmkntgmoygfxypktjxjdkliixyxniutssasrriafu 10 emikuqihgokuorociysg yxniutssasrriafu aiegqmedckgqknky eqpoowonnewbq xfbdnjbazhdnhkhvb qrqgbnmlltlkkbtyn bjfhrnfedlhrlolzfv qppxpoofxcr zhdfpldcbjf stsidponnvnmmdvap zhdfpldcbjfpjmjxdt gdstsidponnvnmmdvap dlhjtphgfnjtnqnbhxr wxwmhtsrrzrqqhzet bjfhrnfedlhrlolzfv frqppxpoofxcr zhdfpldcbjf dponnvnmmdvap ucyakgyxweakehes nondykjiiqihhyqvk

樣例輸出

4 7 3 5 5 1 3 5 10 4

數(shù)據(jù)規(guī)模和約定
設(shè)𝐿1表示𝑛個(gè)字符串的長(zhǎng)度之和,𝐿2表示𝑚次查詢的字符串𝑠1, 𝑠2的長(zhǎng)度之和。

數(shù)據(jù)點(diǎn)𝑛的規(guī)模𝑚的規(guī)模L1的規(guī)模L2的規(guī)模
1= 10= 10≤ 1000≤ 500
2= 200= 1000≤ 160000≤ 160000
3= 500= 5000≤ 400000≤ 800000
4= 1000= 10000≤ 800000≤ 400000
5~7= 2000= 50000≤ 1600000≤ 1600000
8~10= 2000= 100000≤ 1600000≤ 3200000

對(duì)于所有數(shù)據(jù),保證字符串的字符集為小寫(xiě)英文字母

solution

剛開(kāi)始就想了前綴字典樹(shù)和后綴字典樹(shù),但是又要求是同一個(gè)字符串,如果暴力存儲(chǔ)每個(gè)字典樹(shù)節(jié)點(diǎn)代表的子串被包含在哪些字符串里面,似乎就可以前綴后綴對(duì)比求出

但這顯然會(huì)TLETLETLE,可能跟暴力差不多

害怕空間超限制,我又想到了可持久化字典樹(shù),但似乎不大有作用


考試過(guò)程中,游老師突然說(shuō)了句

排完序,就是線性復(fù)雜度了

waitaminute!\rm wait\ a\ minute!wait?a?minute!

我好像沒(méi)有排序誒——我陷入了沉思

排序??

排什么序?排序?yàn)槲規(guī)?lái)了什么好處嗎??

排序會(huì)讓序列變得有序~~(廢話)~~

樹(shù)的dfn序,使得樹(shù)可以被劃分成連續(xù)區(qū)間

..................

真実はいつも一つ!

當(dāng)我將字符串排序后,對(duì)于一段前綴,包含它的字符串一定是一段連續(xù)區(qū)間!!!

于是乎可以像樹(shù)的dfn序求節(jié)點(diǎn)管轄的子樹(shù)區(qū)間,我可以求出包含該前綴的字符串區(qū)間的左右端點(diǎn)

答案通過(guò)這一步就進(jìn)行了字符串篩選,留下的這個(gè)區(qū)間恰好是所有滿足s1s1s1是其前綴的字符串

接下來(lái)就是進(jìn)一步篩選,這些字符串中后綴是s2s2s2的串

首先我怎么做到只要這一段區(qū)間里面的字符串信息呢??

暴力枚舉——這又回到了起點(diǎn),不可取

是的沒(méi)錯(cuò),就是一開(kāi)始的——可持久化

這樣就轉(zhuǎn)化成了前綴和問(wèn)題,rrr版本減去l?1l-1l?1版本即可

s2s2s2為后綴,似乎也是一開(kāi)始的——后綴字典樹(shù)

對(duì),沒(méi)錯(cuò),倒著再來(lái)一個(gè)可持久化字典樹(shù)

時(shí)間復(fù)雜度主要是在前綴字典樹(shù)和后綴字典樹(shù)上跑s1,s2s1,s2s1,s2長(zhǎng)度的字符串求和

前面的一些預(yù)處理,復(fù)雜度沒(méi)有超過(guò)查詢的復(fù)雜度

兩個(gè)部分無(wú)交集,復(fù)雜度是相加關(guān)系

所以取大復(fù)雜度而言,的確是線性的


只要想到了,就非常好寫(xiě)這個(gè)代碼

正解其實(shí)就是把之前的亂想法,安排了一個(gè)順序,前提是拍好了序而已


以上是正解做法

接下來(lái)再分享一種方法把

字符串一般都容易想到——哈希

尤其是想不出正解的時(shí)候,哈希總歸是不會(huì)拋棄你的

這道題就是預(yù)處理對(duì)于每一個(gè)字符串的每一個(gè)前綴/后綴都哈希一下

一共是2?L12*L12?L1

然后查詢的時(shí)候,就直接枚舉nnn個(gè)字符串,然后直接調(diào)第iii個(gè)字符串長(zhǎng)度為s1,s2s1,s2s1,s2的前綴、后綴哈希,跟查詢的兩個(gè)串哈希比較即可

這種做法是O(nm)O(nm)O(nm)

code

#include <cstdio> #include <iostream> #include <algorithm> using namespace std; #define maxn 2002 #define maxm 1600002 int n, m, len, cnt_pre, cnt_suf; string s[maxn]; int L[maxm], R[maxm], sum[maxm], root[maxn]; int pre[maxm][26], suf[maxm][26];void insert_pre( int id ) {len = s[id].length();int now = 0;for( int i = 0;i < len;i ++ ) {int k = s[id][i] - 'a';if( ! pre[now][k] ) pre[now][k] = ++ cnt_pre;now = pre[now][k];if( ! L[now] ) L[now] = id;R[now] = id;} }void insert_suf( int lst, int &now, int id, int d ) {if( ! ~d ) return;now = ++ cnt_suf;for( int i = 0;i < 26;i ++ ) suf[now][i] = suf[lst][i];sum[now] = sum[lst] + 1;int k = s[id][d] - 'a';insert_suf( suf[lst][k], suf[now][k], id, d - 1 ); }string a, b;int find() {int now = 0;for( int i = 0;i < len;i ++ ) {int k = a[i] - 'a';if( ! pre[now][k] ) return 0;else now = pre[now][k];}return now; }int query( int l, int r, int d ) {int k = b[d] - 'a';if( sum[suf[r][k]] - sum[suf[l][k]] == 0 ) return 0;if( d == 0 ) return sum[suf[r][k]] - sum[suf[l][k]];return query( suf[l][k], suf[r][k], d - 1 ); }int main() {freopen( "fix.in", "r", stdin );freopen( "fix.out", "w", stdout );scanf( "%d", &n );for( int i = 1;i <= n;i ++ ) cin >> s[i];sort( s + 1, s + n + 1 );for( int i = 1;i <= n;i ++ ) insert_pre( i ), insert_suf( root[i - 1], root[i], i, len - 1 );scanf( "%d", &m );int ans = 0;while( m -- ) {cin >> a >> b;len = a.length();for( int i = 0;i < len;i ++ ) {int x = a[i] - 'a';x = ( x + ans ) % 26;a[i] = x + 'a';}int pos = find();if( ! pos ) {printf( "%d\n", ans = 0 );continue;}len = b.length();for( int i = 0;i < len;i ++ ) {int x = b[i] - 'a';x = ( x + ans ) % 26;b[i] = x + 'a';}int l = L[pos], r = R[pos];printf( "%d\n", ans = query( root[l - 1], root[r], len - 1 ) );}return 0; } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的加强版[BZOJ#3483] SGU505 Prefixes and suffixes(询问在线版)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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