題目位址
白兔有乙個字串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 ...