Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- const int N = 805;
- const int K = 62;
- int node,n,m;
- char ch[135];
- double ab[135];
- int Next[K][N], fail[N],tes[102][805],ran[128];
- double dp[102][805];
- bool endMark[N], vis[N];
- void init()
- {
- for(int i = 0; i < K; i++) {
- for(int j = 0; j <=node ; j++) {
- Next[i][j] = 0;
- }
- }
- for(int i = 0; i <= node; i++) {
- endMark[i] = false;
- vis[i] = false;
- }
- node=0;
- }
- double cal(int cur,int ver)
- {
- if(tes[cur][ver]!=-1)return dp[cur][ver];
- if(endMark[ver])return 0.0;
- if(cur==m)return 1.0;
- double res=0.0;
- for(int i=0;i<n;i++)
- {
- int id = ran[ch[i]];
- int v=ver;
- while(v && !vis[Next[id][v]]) {
- v = fail[v];
- }
- v = Next[id][v];
- res+=ab[i]*cal(cur+1,v);
- }
- dp[cur][ver]=res;
- tes[cur][ver]=1;
- return res;
- }
- void Insert(string s)
- {
- int v = 0;
- for(int i = 0; i < s.size(); i++) {
- int id = ran[s[i]];
- if(!vis[Next[id][v]]) {
- Next[id][v] = ++node;
- vis[node] = true;
- }
- v = Next[id][v];
- }
- endMark[v] = true;
- }
- void build_fail()
- {
- queue<int>q;
- for(int id = 0; id < K; id++) {
- if(vis[Next[id][0]]) {
- q.push(Next[id][0]); // root's child
- }
- }
- while(!q.empty()) {
- int u = q.front();
- q.pop();
- for(int id = 0; id <K ; id++) {
- int v = Next[id][u];
- if(!vis[v]) continue;
- q.push(v);
- int p = fail[u];
- while(p && vis[Next[id][p]]==0) {
- p = fail[p];
- }
- fail[v] = Next[id][p];
- endMark[v]|=endMark[Next[id][p]];
- }
- }
- }
- int main()
- {
- //ios_base::sync_with_stdio(false);
- // cin.tie(NULL);
- //init();
- for(int i=48;i<=57;i++)ran[i]=i-48;
- for(int i=65;i<=90;i++)ran[i]=i-55;
- for(int i=97;i<=122;i++)ran[i]=i-61;
- char s[135];
- int i,j,k,x,y,z,q,t;
- //cin>>t;
- scanf("%d",&t);
- z=t;
- while(t--)
- {
- init();
- for(i=0;i<102;i++)
- {
- for(j=0;j<804;j++)tes[i][j]=-1,dp[i][j]=0.0;
- }
- //cin>>k;
- scanf("%d",&k);
- while(k--)
- {
- //cin>>s;
- scanf("%s",s);
- //cout<<s<<endl;
- string an=s;
- Insert(an);
- }
- build_fail();
- //cin>>n;
- scanf("%d",&n);
- //cout<<n<<endl;
- for(i=0;i<n;i++)
- {
- scanf("%s %lf",s,&ab[i]);
- ch[i]=s[0];
- // cout<<ch[i]<<endl;
- }
- //cin>>m;
- scanf("%d",&m);
- printf("Case #%d: %.6f\n",z-t,cal(0,0));
- // cout<<"Case #"<<z-t<<": "<<cal(0,0)<<endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment