比赛 |
20170519 |
评测结果 |
AAAAAAAAAA |
题目名称 |
子串 |
最终得分 |
100 |
用户昵称 |
31627012 |
运行时间 |
0.077 s |
代码语言 |
C++ |
内存使用 |
0.63 MiB |
提交时间 |
2017-05-19 20:59:44 |
显示代码纯文本
#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(){;}