首页 > 代码库 > [AC自动机]题目合计

[AC自动机]题目合计

我只是想记一下最近写的题目而已喵~

题解什么的才懒得写呢~

 

[poj 1625]Censored!

这题注意一个地方,就是输入数据中可能有 ASCII 大于 128 的情况,也就是说用 char 读入时,这个字符的值为负数,真是 RE 了好久……

可以像我一样 map 党,你也可以把每个 s[i] 都加上 128

  1 #include <cstdio>  2 #include <cstring>  3 #include <map>  4 #define max(x, y) ((x)>(y) ? (x):(y))  5 const int digit=100000000;  6 const int sizeOfLen=64;  7 const int sizeOfMemory=1024;  8 const int sizeOfType=64;  9  10 struct bigint 11 { 12     int len; 13     int a[20]; 14     inline bigint():len(1) {memset(a, 0, sizeof(a));} 15     inline bigint & operator = (int x) {a[0]=x; return *this;} 16     inline bigint & operator += (bigint x) 17     { 18         len=max(len, x.len); 19         for (int i=0;i<len;i++) 20         { 21             a[i]+=x.a[i]; 22             a[i+1]+=a[i]/digit; 23             a[i]%=digit; 24         } 25         for ( ;a[len];len++) a[len+1]=a[len]/digit, a[len]%=digit; 26         return *this; 27     } 28     inline void print() 29     { 30         printf("%d", a[len-1]); 31         for (int i=len-2;i>=0;i--) printf("%08d", a[i]); 32         putchar(\n); 33     } 34 }; 35  36 int N, M, P; 37 char str[sizeOfLen]; 38 bigint f[sizeOfLen][sizeOfMemory]; 39 std::map<char, int> ord; 40 inline void dynamicProgram(); 41  42 namespace trieDfa 43 { 44     struct node 45     { 46         int order; 47         bool end; 48         node * fail; 49         node * ch[sizeOfType]; 50     }; 51     node memory[sizeOfMemory]; int port; 52     node * dfa=memory; 53     inline node * newnode() 54     { 55         node * ret=memory+port; 56         ret->order=port++; 57         ret->end=0; 58         ret->fail=NULL; 59         memset(ret->ch, 0, sizeof(ret->ch)); 60         return ret; 61     } 62     inline void clear() {port=0; dfa=newnode();} 63  64     inline void insert(char * s) 65     { 66         int len=strlen(s); 67         node * t=dfa; 68         for (int i=0;i<len;i++) 69         { 70             if (!t->ch[ord[str[i]]]) t->ch[ord[str[i]]]=newnode(); 71             t=t->ch[ord[str[i]]]; 72         } 73         t->end=1; 74     } 75     inline void buildDfa() 76     { 77         static node * queue[sizeOfMemory]; 78         int l=0, r=0; 79  80         dfa->fail=dfa; 81         for (int i=0;i<N;i++) 82             if (!dfa->ch[i]) dfa->ch[i]=dfa; 83             else dfa->ch[i]->fail=dfa, queue[r++]=dfa->ch[i]; 84  85         for ( ;l<r; ) 86         { 87             node * u=queue[l++]; 88             u->end|=u->fail->end; 89             for (int i=0;i<N;i++) 90                 if (u->ch[i]) 91                 { 92                     u->ch[i]->fail=u->fail->ch[i]; 93                     queue[r++]=u->ch[i]; 94                 } 95                 else 96                     u->ch[i]=u->fail->ch[i]; 97         } 98     } 99 }100 101 int main()102 {103     scanf("%d %d %d", &N, &M, &P);104     scanf("%s", str);105     for (int i=0;i<N;i++) ord[str[i]]=i;106     trieDfa::clear();107     for (int i=0;i<P;i++)108     {109         scanf("%s", str);110         trieDfa::insert(str);111     }112 113     dynamicProgram();114 115     return 0;116 }117 inline void dynamicProgram()118 {119     bigint ret;120 121     trieDfa::buildDfa();122 123     f[0][0]=1;124     for (int i=0;i<M;i++)125         for (int j=0;j<trieDfa::port;j++)126             for (int k=0;k<N;k++) if (!trieDfa::dfa[j].ch[k]->end)127                 f[i+1][trieDfa::dfa[j].ch[k]->order]+=f[i][j];128     ret=0;129     for (int i=0;i<trieDfa::port;i++) if (!trieDfa::dfa[i].end)130         ret+=f[M][i];131     ret.print();132 }
本傻装B系列1

 

[hdu 2896]病毒侵袭

这真是裸体,而且数据没有 poj 那道丧心病狂

  1 #include <cstdio>  2 #include <cstring>  3 const int sizeOfVirus=512;  4 const int sizeOfText=10025;  5 const int sizeOfType=128;  6 const int sizeOfMemory=100025;  7   8 int N, M;  9 char str[sizeOfText]; 10 int virus[sizeOfMemory]; 11 bool vis[sizeOfVirus]; 12  13 namespace IOspace 14 { 15     inline int getint() 16     { 17         register int num=0; 18         register char ch; 19         do ch=getchar(); while (ch<0 || ch>9); 20         do num=num*10+ch-0, ch=getchar(); while (ch>=0 && ch<=9); 21         return num; 22     } 23     inline void putint(int num) 24     { 25         char stack[10]; 26         register int top=0; 27         for ( ;num;num/=10) stack[++top]=num%10+0; 28         for ( ;top;top--) putchar(stack[top]); 29     } 30 } 31  32 namespace trieDfa 33 { 34     struct node 35     { 36         int order; 37         bool end; 38         node * fail, * last; 39         node * ch[sizeOfType]; 40     }; 41     node memory[sizeOfMemory]; int port; 42     node * dfa=memory; 43     inline node * newnode() 44     { 45         node * ret=memory+port; 46         ret->order=port++; 47         ret->end=false; 48         ret->fail=ret->last=NULL; 49         memset(ret->ch, 0, sizeof(ret->ch)); 50         return ret; 51     } 52     inline void clear() {port=0; dfa=newnode();} 53  54     inline void insert(char * s, int k) 55     { 56         int len=strlen(s); 57         node * t=dfa; 58         for (int i=0;i<len;i++) 59         { 60             if (!t->ch[s[i]]) t->ch[s[i]]=newnode(); 61             t=t->ch[s[i]]; 62         } 63         t->end=true; 64         virus[t->order]=k; 65     } 66     inline void buildDfa() 67     { 68         static node * queue[sizeOfMemory]; 69         int l=0, r=0; 70  71         dfa->fail=dfa; 72         for (int i=0;i<sizeOfType;i++) 73             if (!dfa->ch[i]) dfa->ch[i]=dfa; 74             else dfa->ch[i]->fail=dfa, queue[r++]=dfa->ch[i]; 75  76         for ( ;l<r; ) 77         { 78             node * u=queue[l++]; 79             for (int i=0;i<sizeOfType;i++) 80                 if (u->ch[i]) 81                 { 82                     u->ch[i]->fail=u->fail->ch[i]; 83                     u->ch[i]->last=u->ch[i]->fail->end?u->ch[i]->fail:u->ch[i]->fail->last; 84                     queue[r++]=u->ch[i]; 85                 } 86                 else 87                     u->ch[i]=u->fail->ch[i]; 88         } 89     } 90     inline bool search(char * s) 91     { 92         bool flag=0; 93         int len=strlen(s); 94  95         node * t=dfa; 96         memset(vis, 0, sizeof(vis)); 97         for (int i=0;i<len;i++) 98         { 99             t=t->ch[s[i]];100             if (t->end) vis[virus[t->order]]=flag=true;101             for (node * j=t->last;j;j=j->last)102                 vis[virus[j->order]]=flag=true;103         }104 105         return flag;106     }107 }108 109 int main()110 {111     int tot=0;112 113     N=IOspace::getint();114     trieDfa::clear();115     for (int i=1;i<=N;i++)116     {117         scanf("%s", str);118         trieDfa::insert(str, i);119     }120     trieDfa::buildDfa();121 122     M=IOspace::getint();123     for (int i=1;i<=M;i++)124     {125         scanf("%s", str);126         bool flag=trieDfa::search(str);127         tot+=flag;128 129         if (flag)130         {131             printf("web %d:", i);132             for (int i=1;i<=N;i++) if (vis[i])133                 putchar( ), IOspace::putint(i);134             putchar(\n);135         }136     }137     printf("total: %d\n", tot);138 139     return 0;140 }
本傻装B系列2