昨天比賽和強神討論了快乙個小時,也得出了題解上的方法,只是不知道該怎麼實現,按照我們兩個想的,要求出原串的時間複雜度是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...