1.題目鏈結。求乙個字串本質不同的字串有多少個?本質不同定義為:兩個字串不相等。
2.這個問題其實十分的簡單,從字尾陣列的角度來看,對於每乙個sa[i],我們知道sa[i]代表排名為i的這個字尾所在的位置,假設是j,那麼這個字尾的長度就是n-j.他有n-j個字首,這些字首都是這個字串的子串,可以證明(所有的子串都是可以從這些字尾的字首產生,從數量上就可以證明,二者相等)。但是我們從高度陣列的定義又可以看出來,height[i]表示lcp(sa[i],sa[i-1]),所以i和i-1又會有公共的字首,這些是重複的,減去即可。那麼這個題就十分的簡單了,ans=sigma(n-sa[i]-heigh[i])。時間複雜度o(nlogn).
#include#define ll long long
using namespace std;
const int maxn = 2e5 + 10;
int sa[maxn], rnk[maxn], rsort[maxn], y[maxn], wr[maxn], height[maxn];
char a[maxn];
bool cmp(int a, int b, int len)
void get_sa(int m, int n)
m = p; len <<= 1; }}
void get_height(int n)
}ll solve(int n)
int main()
求字串中長度為k的本質不同串的個數
如果僅僅求長度為k,使用滾動hash即可。下面是求一段長度的本質不同串的個數。lightoj 1314 求字串中長度為k的本質不同串的個數。字尾自動機中每個節點包含著一段連續長度的子串,遍歷每個節點,記乙個差分陣列即可統計長度為1 s 的不同子串個數。lightoj 1314 ac 原題統計長度p到...
C語言(字串的本質)
c語言沒有字串型別,所有的字串其實都是字元指標,而且是乙個指向其首字元的指標。比如 abc 就是乙個指向字元 a 的指標。拓展 char p abc 此處,就是將 a 的位址賦值給了指標p,因此我們一般說 p指向了字串 abc 其實只是一種簡便的習慣說法,嚴格地說法應該是 p指向了字串 abc 的首...
哈希求多少個不同的字串
如題,給定n個字串 第i個字串長度為mi,字串內包含數字 大小寫字母,大小寫敏感 請求出n個字串中共有多少個不同的字串。輸入格式 第一行包含乙個整數n,為字串的個數。接下來n行每行包含乙個字串,為所提供的字串。輸出包含一行,包含乙個整數,為不同的字串個數。輸入5 abcaaaa abcabcc 12...