zoukankan      html  css  js  c++  java
  • HDU

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

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

    再一想,复杂度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 }
  • 相关阅读:
    Tuxedo 介绍
    winform如何不卡界面
    银行基金代销系统调研
    如何在wcf中用net tcp协议进行通讯
    20190710用控制台启动一个wcf服务
    wcf必知必会以及与Webapi的区别
    2019年7月第一周总结-RabbitMQ总结
    RabbitMQ入门学习系列(七) 远程调用RPC
    RabbitMQ入门学习系列(六) Exchange的Topic类型
    RabbitMQ入门学习系列(五) Exchange的Direct类型
  • 原文地址:https://www.cnblogs.com/asdfsag/p/11779084.html
Copyright © 2011-2022 走看看