KMP
const int inf=0x3f3f3f;
const int maxn=1e6+6;
const int base=32;
const int mod = 1e9+7;
char a[maxn],b[maxn];
ll lena,lenb;
int next1[maxn];
void getnext(){
next1[0]=-1;
int i=0,j=-1;
while(i<lena){//子串
if(j==-1||a[i]==a[j]){//子串
i++;j++;
if(a[i]==a[j]) next1[i]=next1[j];
else next1[i]=j;
}
else{
j=next1[j];
}
}
}
int KMP(){
int i=0,j=0,ans=0;
while(i<lena&&j<lenb){//子串 母串
if(i==-1||a[i]==b[j]){
i++;j++;
}
else i=next1[i];
if(i==lena){
ans++;//出现次数....
i=next1[i];
}
}
return ans;
}
int main(){
return 0;
}
字典树
const int inf=0x3f3f3f;
const int maxn=1e6+6;
const int base=32;
const int mod = 1e9+7;
int num[maxn]={0};//以该字母开头单词的个数
struct trie{
int next[30];//分支
}t[maxn];
int pos=1;
void add(char s[]){
int p=0;
int len=strlen(s);
for(int i=0;i<len;i++){
int n=s[i]-'a';
if(t[p].next[n]==0)
t[p].next[n]==pos++;
p=t[p].next[n];
num[p]++;
}
}
int find(char s[]){
int p=0;
int len=strlen(s);
for(int i=0;i<len;i++){
int n=s[i]-'a';
if(t[p].next[n]==0)
return 0;
p=t[p].next[n];
}
return num[p];
}
哈希
ll hash1[maxn];
int lena,lenb;
for(int i=0;i<lena;i++){
sum=sum*base+(int)a[i];
}//子串的哈希值
hash1[0]=0;
for(int i=1;i<=lenb;i++){
hash1[i]=hash1[i-1]*base+b[i-1];
}//每个位置上从前向后的哈希值