maya这绝对是我学得最痛苦的一次
实际上到现在
还不是很明白
总之就是
多串匹配问题
把需要匹配的单词
排成一棵Trie树
构建失败指针
然后
就可以开始匹配了
构建失败指针
算是核心内容
就是把自己的失败指针
指向自己的父亲的失败指针
下面的自己
父亲的失败指针不行的话
还有
父亲的失败指针的失败指针
父亲的失败指针的失败指针的失败指针
总之最后实在不行只能连到根上了
你问我
说的怎么这么粗糙
废话
多说几句
我其实不会
这个事实
不就露馅了吗
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
struct tree
{
int nxt[26],count,fail;
}ruby[20000];
int que[50000],n;
char word[2000][22000],text[500000],tot,head=1,tail;
void builttree()
{
int i,j,k,len,num;
for(i=1;i<=n;i++)
{
k=0;
len=strlen(word[i]);
for(j=0;j<len;j++)
{
num=word[i][j]-'a';
if(!ruby[k].nxt[num])
{
tot++;
ruby[k].nxt[num]=tot;
}
k=ruby[k].nxt[num];
}
ruby[k].count++;
}
}
void builtfail()
{
int i,ind,idf;
for(i=0;i<26;i++)
if(ruby[0].nxt[i])
{
tail++;
que[tail]=ruby[0].nxt[i];
}
while(head!=tail)
{
ind=que[head];
idf=ruby[ind].fail;
for(i=0;i<26;i++)
if(ruby[ind].nxt[i])
{
tail++;
que[tail]=ruby[ind].nxt[i];
while(idf&&!ruby[idf].nxt[i]) idf=ruby[idf].fail;
if(ruby[idf].nxt[i])
{
int tem=ruby[ind].nxt[i];
ruby[tem].fail=ruby[idf].nxt[i];
}
}
head++;
}
}
void find()
{
int i,len,now=0,ans=0,idf;
len=strlen(text);
for(i=0;i<len;i++)
{
int num=text[i]-'a';
while(idf&&!ruby[idf].nxt[num]) idf=ruby[idf].fail;
if(ruby[idf].nxt[num])
{
idf=ruby[idf].nxt[num];
int p=idf;
while(p>0&&ruby[p].count)
{
ans+=ruby[p].count;
ruby[p].count=0;
p=ruby[p].fail;
}
}
}
printf("%d",ans);
}
int main()
{
int i;
scanf("%d",&n);
scanf("%s",text);
for(i=1;i<=n;i++)
scanf("%s",word[i]);
builttree();
builtfail();
find();
return 0;
}