字串hash 鏈式前向星

2021-09-11 08:00:38 字數 1215 閱讀 7231

題目位址

白兔有乙個字串t。白雲有若干個字串s1,s2…sn。

白兔想知道,對於白雲的每乙個字串,它有多少個子串是和t迴圈同構的。

所有字元都是小寫英文本母

輸入描述:

第一行乙個字串t(|t|<=10^6)

第二行乙個正整數n (n<=1000)

接下來n行為s1~sn (|s1|+|s2|+…+|sn|<=107),max(|s1|,|s2|,|s3|,|s4|,…|sn|)<=106

輸出描述:

輸出n行表示每個串的答案。

e.g.1

input:

abab

2abababab

ababcbaba

output:52

首先字串很長,我們考慮使用hash儲存,將字串轉化為hash方式。因為要求是迴圈同構,我們可以在字串t後再新增乙個字串t,遍歷後可以獲得字串t的所有同構方式。並用鏈式前向星將每種同構方式存起來,以便之後的查詢。

#includeusing namespace std;

#define ull unsigned long long

typedef pairp;

const int n = 2e6+5;

const int mod = 1e5+7;

const int base = 123;

ull h[n];

ull hash[n];

char s[n];

int head[mod];

int tot = 0;

struct nodeedge[n];

void add(ull x)

int find(ull x)

} return 0;

}int main()

int len = strlen(s+1);

for(int i = len+1;i <= 2*len;i++)

hash[0] = 0;

for(int i = 1;i <=2*len;i++)

} int t;

scanf("%d",&t);

while(t--)

} printf("%d\n",ans);

} return 0;

}

前向星和鏈式前向星

我們首先來看一下什麼是前向星.前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置和儲存長度,那麼前向星就構造好了.用len i 來記錄所有以i為起點的邊在陣列中的儲存長度.用head i 記...

前向星和鏈式前向星

前向星 前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置。鏈式前向星 鏈式前向星其實就是靜態建立的鄰接表,時間效率為o m 空間效率也為o m 遍歷效率也為o m next表示當前結點的下...

前向星和鏈式前向星

1 前向星 前向星是以儲存邊的方式來儲存圖,先將邊讀入並儲存在連續的陣列中,然後按照邊的起點進行排序,這樣陣列中起點相等的邊就能夠在陣列中進行連續訪問了。它的優點是實現簡單,容易理解,缺點是需要在所有邊都讀入完畢的情況下對所有邊進行一次排序,帶來了時間開銷,實用性也較差,只適合離線演算法。圖一 2 ...