码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-11-01 20:42:22      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:include   new   c++   lower   res   for   type   const   表达式   

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

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

再一想,复杂度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\n",++ka,ed[GO[1][1]]?"Yes":"No");
55     }
56     return 0;
57 }

 

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

标签:include   new   c++   lower   res   for   type   const   表达式   

原文地址:https://www.cnblogs.com/asdfsag/p/11779084.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!