題意:給定乙個字串,求出不重複且出現過至少兩次的子串個數;
思路: 典型的字尾陣列題,只是比賽中沒考慮到時間,以為o(n^2)覺得爆,沒看到時間是10s,唉。。
就是字尾後,列舉子串可能的長度,對 height 分組,維護長度一定時改子串的起點的最大,最小值;
如果 (max-min>= k) ,就是ans++; 總是以後做題必定考慮下時間效率;
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
const int maxn=10010;
char s[maxn];
int sa[maxn],t[maxn],t2[maxn],c[maxn],n;
void build_sa(int n,int m) }
//lcp
int ra[maxn],height[maxn];
void getheight(int n)
else //更新max,min
} }}
int main()
{ while(~scanf("%s",s))
{int n=strlen(s);
build_sa(n+1,200);
getheight(n);
sum=0;
calc(n);
cout<
ACdream原創群賽 13 I 字尾陣列
對於i,a i 即為i之後的所有a i 的和加字尾s 0 與s i 的最長公用字首。求fbi時可以先打表打出前100000個,小的直接查表,大的用矩陣快速冪求。this code is made by 2bpencil problem 1116 verdict accepted submission...
字尾樹 字尾陣列
在字串處理當中,字尾樹和字尾陣列都是非常有力的工具,其中字尾樹大家了解得比較多,關於字尾陣列則很少見於國內的資料。其實字尾陣列是字尾樹的乙個非 常精巧的替代品,它比字尾樹容易程式設計實現,能夠實現字尾樹的很多功能而時間複雜度也不太遜色,並且,它比字尾樹所占用的空間小很多。可以說,在資訊學競賽 中字尾...
字尾樹 字尾陣列
我們考慮將乙個串的所有字尾插入乙個trie中,得到的trie就是字尾trie。我們可以發現,樹上有分叉或者是字尾節點的點的個數是o l en o len o len 個,這個後面解釋,於是把沒有分支並且不是字尾節點的點壓縮到一起,就變成了字尾樹。不難發現,字尾樹可以表示該字串的所有子串。下面分析一下...