[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

 

你可能感兴趣的:(AC自动机)