• 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 }
  • 相关阅读:
    【26】多任务学习
    【25】迁移学习
    【24】定位数据不匹配
    【23】不匹配数据划分的偏差和方差;判断问题所在的几个重要参数
    【22】在不同的划分上进行训练和测试
    【21】进行误差分析
    17-----vue-cli脚手架安装和webpack-simple模板项目生成
    15-----修饰符
    14-----表单输入绑定
    12-----指令系统介绍
  • 原文地址:https://www.cnblogs.com/asdfsag/p/11779084.html
Copyright © 2020-2023  润新知