+ // FIXME More succinct solution needed
+ unsigned* maptexts = new unsigned[n+1];
+ // Map text chars to [0..255+numberOfTexts]
+ unsigned count = 0;
+ for (ulong i = 0; i < n; ++i)
+ if (texts[i] == 0)
+ maptexts[i] = ++count; // endmarkers \in [1..numberOfTexts]
+ else {
+ uchar c = (uchar)texts[i];
+ maptexts[i] = (unsigned)c + numberOfTexts + 1;
+ }
+
+ maptexts[n] = '\0';
+ texts.erase();
+ texts.reserve(0); // Release capacity
+ assert(count == numberOfTexts);
+
+ bwtEndPos = (ulong)compute_bwt(&maptexts[0], &maptexts[n],
+ &bwt[0], numberOfTexts + 1);
+
+ bwt[--bwtEndPos] = '\0';
+ delete [] maptexts;
+ } // End of bw transform
+
+#ifdef CSA_TEST_BWT
+ {
+ uchar *bwtTest = dynFMI->getBWT();
+/* printf("123456789012345678901234567890123456789\n");
+ for (TextPosition i = 0; i < n && i < 100; i ++)
+ if (bwt[i] < 50)
+ printf("%d", (int)bwt[i]);
+ else
+ printf("%c", bwt[i]);
+ printf("\n");
+ for (TextPosition i = 0; i < n && i < 100; i ++)
+ if (bwtTest[i] < 50)
+ printf("%d", (int)bwtTest[i]);
+ else
+ printf("%c", bwtTest[i]);
+ printf("\n");*/
+
+ // Sanity check
+ assert(numberOfTexts == dynFMI->getCollectionSize());
+
+ delete dynFMI;
+ dynFMI = 0;
+ for (ulong i = 0; i < n; ++i)
+ if (bwt[i] != bwtTest[i])
+ {
+ std::cout << "i = " << i << ", bwt = " << (unsigned)bwt[i] << ", " << (unsigned)bwtTest[i] << std::endl;
+ assert(0);
+ }
+ delete [] bwtTest;