|  | 
|  | 
| вернуться в форум | help with aho corasick MLE 7! I can't think of a way to store goto and fail transitions of so many vertices and avoid MLE. please help.
 here's code:
 
 #include <stdio.h>
 #include <queue>
 using namespace std;
 short g[110000][256];
 short f[110000];
 short o[110000];
 short n,m,newstate=0;
 queue<short>Q;
 int main(void){
 short i,pos=0,q,r,u,v,ch,state;
 scanf("%hd",&n);getchar();
 for(i=1;i<=n;++i){
 r=0;
 ch=getchar();
 state=0;
 ++r;
 ch+=128;
 while(g[state][ch]){
 state=g[state][ch];
 ch=getchar();
 ++r;
 ch+=128;
 }
 while(ch!='\n'+128){
 newstate=newstate+1;
 g[state][ch]=newstate;
 state=newstate;
 ch=getchar();
 ++r;
 ch+=128;
 }
 o[state]=r-1;
 }
 for(i=0;i<256;++i){
 if(q=g[0][i]){
 f[q]=0;
 Q.push(q);
 }
 }
 while(!Q.empty()){
 r=Q.front();
 Q.pop();
 for(i=0;i<256;++i){
 u=g[r][i];
 if(!(u==0&&r>0)){
 Q.push(u);
 v=f[r];
 while(g[v][i]==0&&v>0) v=f[v];
 f[u]=g[v][i];
 if(o[u]==0) o[u]=o[f[u]];
 }
 }
 }
 scanf("%hd",&m);getchar();
 for(i=1;i<=m;++i){
 q=0;r=0;
 while((ch=getchar())!='\n'){
 ch+=128;
 ++r;
 while(g[q][ch]==0&&q>0) q=f[q];
 q=g[q][ch];
 if(o[q]){
 printf("%hd %hd",i,r-o[q]+1);
 return 0;
 }
 }
 }
 printf("Passed\n");
 return 0;
 }
Re: help with aho corasick MLE 7! you got pretty close, modified your solution to get AC. let me know if you need hints :) ikhomeriki@gmail.com
 Edited by author 21.09.2018 23:04
 | 
 | 
|