• [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('
    ');
     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('
    ');
    135         }
    136     }
    137     printf("total: %d
    ", tot);
    138 
    139     return 0;
    140 }
    本傻装B系列2
  • 相关阅读:
    第16周作业
    第15周作业
    迟到的第14周作业
    第13次作业集
    软件工程结课总结
    第13次作业
    第12次作业
    第11次作业--字符串的处理
    第10次作业(2)
    第十次作业
  • 原文地址:https://www.cnblogs.com/dyllalala/p/3906744.html
Copyright © 2020-2023  润新知