HDU - 5557 Matching Compressed String (自动机+倍增+表达式计算)

Posted asdfsag

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU - 5557 Matching Compressed String (自动机+倍增+表达式计算)相关的知识,希望对你有一定的参考价值。

题意是给你一个自动机和一个字符串的括号表达式,问自动机能否接受这个字符串。

我一想,这不就是个模拟栈计算表达式+倍增么?

再一想,复杂度200*1000*10000*log(1e9),不对啊!

交上去试一发,卧槽A了?我:......

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N=10000+10,M=26;
 5 int n,len,m,k,ka,go[1010][M],ed[1010],sta1[N],sta2[N],tot,tp1,tp2,num,GO[N][1010],buf[1010];
 6 char s[N];
 7 int newnode() {
 8     int u=++tot;
 9     for(int i=1; i<=n; ++i)GO[u][i]=i;
10     return u;
11 }
12 int main() {
13     int T;
14     for(scanf("%d",&T); T--;) {
15         scanf("%s",s),len=strlen(s);
16         scanf("%d%d%d",&n,&m,&k);
17         for(int i=1; i<=n; ++i) {
18             ed[i]=0;
19             memset(go[i],0,sizeof go[i]);
20         }
21         while(k--) {
22             int x;
23             scanf("%d",&x),x++;
24             ed[x]=1;
25         }
26         while(m--) {
27             int u,v;
28             char ch;
29             scanf("%d%d %c",&u,&v,&ch),u++,v++;
30             go[u][ch-a]=v;
31         }
32         tot=tp1=tp2=num=0;
33         sta1[tp1++]=newnode(),sta2[tp2++]=1;
34         for(int i=0; i<len; ++i) {
35             if(s[i]==() {
36                 sta1[tp1++]=newnode();
37                 sta2[tp2++]=num;
38                 num=0;
39             } else if(s[i]==)) {
40                 int U=sta1[--tp1],k=sta2[--tp2];
41                 for(; k; k>>=1) {
42                     if(k&1)for(int i=1; i<=n; ++i)GO[sta1[tp1-1]][i]=GO[U][GO[sta1[tp1-1]][i]];
43                     for(int i=1; i<=n; ++i)buf[i]=GO[U][GO[U][i]];
44                     for(int i=1; i<=n; ++i)GO[U][i]=buf[i];
45                 }
46             } else if(isdigit(s[i])) {
47                 num=num*10+(s[i]-0);
48             } else if(islower(s[i])) {
49                 int ch=s[i]-a;
50                 for(int i=1; i<=n; ++i)
51                     GO[sta1[tp1-1]][i]=go[GO[sta1[tp1-1]][i]][ch];
52             }
53         }
54         printf("Case #%d: %s
",++ka,ed[GO[1][1]]?"Yes":"No");
55     }
56     return 0;
57 }

 

以上是关于HDU - 5557 Matching Compressed String (自动机+倍增+表达式计算)的主要内容,如果未能解决你的问题,请参考以下文章

HDU1306 String Matching 暴力

HDU 6629 string matching(拓展kmp)

HDU 6073 Matching In Multiplication(拓扑排序)

HDU 6073 Matching In Multiplication dfs遍历环 + 拓扑

hdu多校第3场C. Dynamic Graph Matching

C - Dynamic Graph Matching HDU - 6321