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 (自动机+倍增+表达式计算)的主要内容,如果未能解决你的问题,请参考以下文章
HDU 6629 string matching(拓展kmp)
HDU 6073 Matching In Multiplication(拓扑排序)
HDU 6073 Matching In Multiplication dfs遍历环 + 拓扑