比赛 20170519 评测结果 AAAAAAAAAA
题目名称 子串 最终得分 100
用户昵称 Hyoi_0Koto 运行时间 0.060 s
代码语言 C++ 内存使用 0.42 MiB
提交时间 2017-05-19 20:57:32
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
#include<vector>
#include<queue>
using namespace std;
const int SIGMA_SIZE=64;
const int MAXNODE=500;
inline void in(int &x){
    x=0;int f=1;char t=getchar();
    while(!isdigit(t)){if(t=='-')f=-1;t=getchar();}
    while(isdigit(t)){x=x*10+t-48;t=getchar();}
    x*=f;
}
int idx[256];
char s[30][30];
double prob[SIGMA_SIZE];
int n;
struct AhoCorasickAutomata{
    int ch[MAXNODE][SIGMA_SIZE];
    int f[MAXNODE];
    int match[MAXNODE];
    int sz;

    inline void init(){
        sz=1;
        memset(ch[0],0,sizeof(ch[0]));
    }

    inline void insert(char *s){
        int u = 0,n = strlen(s);
        for(int i=0; i<n; i++){
            int c = idx[s[i]];
            if(!ch[u][c]){
                memset(ch[sz],0,sizeof(ch[sz]));
                match[sz] = 0;
                ch[u][c] = sz++;
            }
            u = ch[u][c];
        }
        match[u] = 1;
    }

    inline void getFail(){
        queue<int> q;
        f[0] = 0;
        for(int c=0; c<SIGMA_SIZE; c++){
            int u = ch[0][c];
            if(u)
            {
                f[u] = 0;
                q.push(u);
            }
        }
        while(!q.empty()){
            int r = q.front();
            q.pop();
            for(int c=0; c<SIGMA_SIZE; c++){
                int u = ch[r][c];
                if(!u){
                    ch[r][c]=ch[f[r]][c];
                    continue;
                }
                q.push(u);
                int v = f[r];
                while(v&&!ch[v][c]) v = f[v];
                f[u] = ch[v][c];
                match[u] |=match[f[u]];
            }
        }
    }
};
AhoCorasickAutomata ac;
double d[MAXNODE][105];
int vis[MAXNODE][105];
inline double getProb(int u,int l){
    if(!l) return 1.0;
    if(vis[u][l]) return d[u][l];
    vis[u][l]=1;
    double& ans=d[u][l];
    ans=0.0;
    for(int i=0;i<n;i++){
        if(!ac.match[ac.ch[u][i]]) ans += prob[i]*getProb(ac.ch[u][i],l-1);
    }
    return ans;
}
inline void work(){
    int T;
    scanf("%d",&T);
    for(int kase=1;kase<=T;kase++){
        int k,l;
        in(k);
        for(int i=0; i<k; i++) scanf("%s",s[i]);
        in(n);
        for(int i=0; i<n; i++){
            char ch[9];
            scanf("%s%lf",ch,&prob[i]);
            idx[ch[0]] = i;
        }
        ac.init();
        for(int i=0; i<k; i++) ac.insert(s[i]);
        ac.getFail();
        in(l);
        memset(vis,0,sizeof(vis));
        printf("Case #%d: %.6lf\n",kase,getProb(0,l));
    }
}
inline int mian(){
    freopen("substrings.in","r",stdin);
    freopen("substrings.out","w",stdout);
    work();
}
int miku=mian();
int main(){;}