hdoj 4644 BWT 字串匹配

2021-06-17 19:54:10 字數 2914 閱讀 6573

昨天比賽和強神討論了快乙個小時,也得出了題解上的方法,只是不知道該怎麼實現,按照我們兩個想的,要求出原串的時間複雜度是o(n^2*logn),而且空間也很大,沒辦法寫,然後今天看了大牛的標程,發現分析還是差了那麼一點。 大

牛的解析:

可以注意到生成的bwt(t)可以還原成為原始的t,方法如下表所示

add  1gc

aaac

sort 1aa

accg

add 2

g$ca

$aaa

acac

cgsort 2

$aaa

acac

cacg

g$add 3

g$acaa

$acaac

acaacg

cg$sort 3

$acaac

acaacg

caacg$

g$aadd 4

g$ac

caac

$aca

aacg

acaa

acg$

cg$a

sort 4

$aca

aacg

acaa

acg$

caac

cg$a

g$ac

add 5

g$aca

caacg

$acaa

aacg$

acaac

acg$a

cg$ac

sort 5

$acaa

aacg$

acaac

acg$a

caacg

cg$ac

g$aca

add 6

g$acaa

caacg$

$acaac

aacg$a

acaacg

acg$ac

cg$aca

sort 6

$acaac

aacg$a

acaacg

acg$ac

caacg$

cg$aca

g$acaa

add 7

g$acaac

caacg$a

$acaacg

aacg$ac

acaacg$

acg$aca

cg$acaa

sort 7

$acaacg

aacg$ac

acaacg$

acg$aca

caacg$a

cg$acaa

g$acaac

然後就是怎麼寫可以將原串求出來,不用最笨的方法。

注意分析就會發現,每次對新增加

字元的字串進行排序時,其排序的位置都是相同的,即例子中的原

串為gc$aaac,第一次按照公升序排列好為$

aaaccg,

將兩個串合併後的到的所

有的字串就是

g$     排完序後為   $a

ca                            aa

$a                            ac

aa                            ac

ac                            ca

ac                            cg

cg                            g$

可以發現在給定字串中的字元其前面有幾個相同字元,排完序後仍然有幾個相同的字元(後面本身就是按照字典序進行排列的,所以排序時只按照第乙個字母的字典序就可以了),所以每次排序後每個串所在的位置就可以固定,由此

在o(n)的時間求得原串、

接下來利用kmp演算法依次來匹配下面的詢問就可以了。(我是多久沒有寫過kmp啦,竟然把next陣列建立在了主串上,貢獻了好多的tle o_o );

下面的**是看了標程之後寫的,不懂可以看注釋!

/

// file name: 4644.cpp

// author: wang

// mail:

// created time: 2013-8-7 10:39:29

/#include #include #include #include #include #include#include #include#include#include using namespace std;

typedef long long ll;

#define inf (int_max/10)

#define sqr(x) ((x)*(x))

#define rep(i, n) for (int i=0; i<(n); ++i)

#define repf(i, a, b) for (int i=(a); i<=(b); ++i)

#define repd(i, a, b) for (int i=(a); i>=(b); --i)

#define clr(ar,val) memset(ar, val, sizeof(ar))

#define pb(x) push_back(x)

#define n 100096

int n;

int next[n];

char a[200010];

string s;

string solve()

//對給定的字元進行排序,來保證最先的字典序的

string sorted=s;

sort(sorted.begin(),sorted.end());

// cout<>s)

}if(flag==1) printf("yes\n");

else printf("no\n");

} }}

HDOJ 字串統計

problem description 對於給定的乙個字串,統計其中數字字元出現的次數。input 輸入資料有多行,第一行是乙個整數n,表示測試例項的個數,後面跟著n行,每行包括乙個由字母和數字組成的字串。output 對於每個測試例項,輸出該串中數值的個數,每個輸出佔一行。sample input...

hdoj 2017 字串統計 字串

對於給定的乙個字串,統計其中數字字元出現的次數。輸入資料有多行,第一行是乙個整數n,表示測試例項的個數,後面跟著n行,每行包括乙個由字母和數字組成的字串。對於每個測試例項,輸出該串中數值的個數,每個輸出佔一行。2 asdfasdf123123asdfasdf asdf111111111asdfasd...

HDOJ 1274 展開字串

乙個關於字串處理的題目,因為有括號,如果每一次都是去找最裡面的左括號再找對應右括號肯定不好處理,我們採取的方法就是直接從左到右的處理,然後遇到括號我們就採取遞迴的思想去處理,因為涉及到字串的拼接,所以這裡我們最好用到的c string型別,雖然慢但是還是比較好用的。include include i...