白兔有乙個字串t。白雲有若干個字串s1,s2..sn。
白兔想知道,對於白雲的每乙個字串,它有多少個子串是和t迴圈同構的。
所有字元都是小寫英文本母
第一行乙個字串t(|t|<=10^6)第二行乙個正整數n (n<=1000)接下來n行為s1~sn (|s1|+|s2|+…+|sn|<=10^7),max(|s1|,|s2|,|s3|,|s4|,..|sn|)<=10^6
首先把字串t放大一倍,這樣就能找到所有的t的長度為len的情況了。然後hash一遍,標記一下。
然後對於輸入的t個字串,處理他的每個長度為len的子串,看是否被標記過。
(map會超時,可以模擬map)
ac**:
1 #include2using
namespace
std;
3 # define ll long
long
4 # define ull unsigned long
long
5const
int mod = 1e9+7;6
const
int maxn = 1e6+100;7
const ull base = 131;8
const
int mod_map = 14937;9
char
str1[maxn],str2[maxn];
10ull ind[maxn],hash1[maxn],hash2[maxn];
11void
init1()
1218}19
struct
node
20 edge[maxn];
24int
head[maxn],cnt;
25void
addedge(ull x)// 類似於乙個對映
2632
intfind(ull x)
3340
return0;
41}42 ull get_sub1(int l,int
r)43
46 ull get_sub2(int l,int
r)47
50void
init2()
5158
for(int i=1; i<=len+len; i++)
5966}67
}68intmain()
6989 printf("
%d\n
",ans);90}
91return0;
92 }
1 #include2vector版using
namespace
std;
3 # define ll long
long
4 # define ull unsigned long
long5//
# define ull (unsigned long long)
6const
int maxn = 2e6+100;7
const
int mod_map = 14937;8
const ull base = 131;9
ull ind[maxn];
10ull hash1[maxn],hash2[maxn];
11char
str[maxn];
12 vectoredge[maxn];
13void
add(ull t)
1418 ull getsub1(int l,int
r)19
22 ull getsub2(int l,int
r)23
26bool
find(ull tmp)
2734
return
false;35
}36void
init()
3743
int len=strlen(str+1
);44
for(int i=1+len; i<=len+len; i++)
4548
for(int i=1; i<=len+len; i++)
4955}56
}57intmain()
5877
}78 printf("
%d\n
",ans);79}
80return0;
81 }
白兔的字串 字串hash
原題 一道典型的字串hash,至於hash,這裡講的非常好。一開始用map函式一直超時,後來改用unordered map就過了,至於這2個map的區別,這裡講的挺清楚的。之後去查了一下其它方法,發現還有一種方法是手寫map函式 強 指明 大佬 unordered map是跑了600ms,重寫跑了1...
白兔的字串
時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld白兔有乙個字串t。白雲有若干個字串s1,s2 sn。白兔想知道,對於白雲的每乙個字串,它有多少個子串是和t迴圈同構的。所有字元都是小寫英文本母 輸入描述 第一行乙個字...
字串雜湊 牛客白兔的字串
時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 題目描述 abab 2abababab ababcbaba 輸出 cpp 52 include using namespace std typedef unsign...