p1366上字典树水过
虽然写着AC自动机,但是我寻思着m*maxlen也能写啊为啥写的人这么少?
对于所有的单词可以建立一个字典树,小小的改动就是把单词的结尾记录sum++,然后枚举开头能跳的话就向下跳,如果跳到一个地方发现sum!=0显然可以ans+=sum,sum=0;
<=50*1000000AC,甚至比康神AC自动机跑的快.
using namespace std; struct tree { int head[30],flag; char emm; }e[500010]; int i,f,now,tot,n,len,maxlen,ans; char tt[60],wu[1001000]; void add(int d,int now) { tt[d]-='a'; if(!e[now].head[tt[d]]) tot++,e[now].head[tt[d]]=tot; now=e[now].head[tt[d]]; if(d==len-1) { e[now].flag++; return ; } add(d+1,now); return ; } int main() { scanf("%d\n",&n); for(i=1;i<=n;i++) { scanf("%s",tt); len=strlen(tt); maxlen=max(maxlen,len); add(0,0); } scanf("%s",wu); len=strlen(wu); for(i=0;i<len;i++)//枚举开头 { for(now=0,f=i;;f++) { if(e[now].head[wu[f]-'a'])//往下跳 now=e[now].head[wu[f]-'a']; else break; if(e[now].flag) ans+=e[now].flag,e[now].flag=0;//统计答案 } } cout<<ans; return 0; }