题解

15 条题解

  • 0
    @ 2025-06-16 20:01:36
    /*
    
    p_b_p_b txdy
    AThousandSuns txdy
    Wu_Ren txdy
    Appleblue17 txdy
    
    */
    
    #include <bits/stdc++.h>
    #define pb push_back
    #define fst first
    #define scd second
    #define mems(a, x) memset((a), (x), sizeof(a))
    
    using namespace std;
    typedef long long ll;
    typedef long double ldb;
    typedef pair<ll, ll> pii;
    
    const int maxn = 110;
    const ldb EPS = 1e-8;
    
    int n, m, K;
    ldb a[maxn][maxn], p[maxn];
    char s[maxn];
    
    struct AC {
        int tot, ch[maxn][15], fail[maxn], idx[maxn];
        
        void insert(char *s, int id) {
            int p = 0;
            for (int i = 0; s[i]; ++i) {
                if (!ch[p][s[i] - 'A']) {
                    ch[p][s[i] - 'A'] = ++tot;
                }
                p = ch[p][s[i] - 'A'];
            }
            idx[p] = id;
        }
        
        void build() {
            queue<int> q;
            for (int i = 0; i < m; ++i) {
                if (ch[0][i]) {
                    q.push(ch[0][i]);
                }
            }
            while (q.size()) {
                int u = q.front();
                q.pop();
                for (int i = 0; i < m; ++i) {
                    if (ch[u][i]) {
                        fail[ch[u][i]] = ch[fail[u]][i];
                        q.push(ch[u][i]);
                    } else {
                        ch[u][i] = ch[fail[u]][i];
                    }
                }
            }
        }
    } ac;
    
    void gauss() {
        for (int i = 0; i <= ac.tot; ++i) {
            int r = -1;
            for (int j = i; j <= ac.tot; ++j) {
                if (fabs(a[i][j]) > EPS) {
                    r = j;
                    break;
                }
            }
            if (r == -1) {
                continue;
            }
            for (int j = i; j <= ac.tot + 1; ++j) {
                swap(a[i][j], a[r][j]);
            }
            for (int j = i + 1; j <= ac.tot + 1; ++j) {
                a[i][j] /= a[i][i];
            }
            a[i][i] = 1;
            for (int j = 0; j <= ac.tot; ++j) {
                if (i == j) {
                    continue;
                }
                for (int k = i + 1; k <= ac.tot + 1; ++k) {
                    a[j][k] -= a[j][i] * a[i][k];
                }
                a[j][i] = 0;
            }
        }
    }
    
    void solve() {
        scanf("%d%d%d", &n, &K, &m);
        for (int i = 0, x, y; i < m; ++i) {
            scanf("%d%d", &x, &y);
            p[i] = 1. * x / y;
        }
        for (int i = 1; i <= n; ++i) {
            scanf("%s", s);
            ac.insert(s, i);
        }
        ac.build();
        for (int i = 1; i <= n; ++i) {
            for (int j = 0; j <= ac.tot; ++j) {
                for (int k = 0; k <= ac.tot + 1; ++k) {
                    a[j][k] = 0;
                }
            }
            for (int u = 0; u <= ac.tot; ++u) {
                if (ac.idx[u] == i) {
                    a[u][u] = 1;
                    a[u][ac.tot + 1] = 1;
                } else if (ac.idx[u]) {
                    a[u][u] = 1;
                    a[u][ac.tot + 1] = 0;
                } else {
                    a[u][u] = 1;
                    for (int j = 0; j < m; ++j) {
                        a[u][ac.ch[u][j]] -= p[j];
                    }
                }
            }
            gauss();
            printf("%.2Lf\n", a[0][ac.tot + 1]);
        }
    }
    
    int main() {
        int T = 1;
        // scanf("%d", &T);
        while (T--) {
            solve();
        }
        return 0;
    }
    
  • -1
    @ 2009-07-11 14:07:53

    沙茶题,就是懒得编了。

    大家稍微注意一下就行了,数据中有一个点是所有人都输,比赛的时候我就这个点WA了.

  • -2
    @ 2009-11-03 17:35:32

    数据出水了。我开始时AC自动机建错了也80!

    求神牛n^3的算法,小菜用的是循环到1000求概率和的算法,由于精度要求不高过了。至于更加精确的算法,希望神牛点拨。

  • -2
    @ 2009-08-15 17:49:51

    注意:输出的不是字符串出现的概率,而是每个人的胜率。。。

    这里我调了一天啊!!!

  • -2
    @ 2009-08-13 23:47:13

    sigma(p(事件)) 当长度越大概率越趋近0,所以直接统计足够长的序列中即可

  • -2
    @ 2009-08-07 08:29:05

    怎样做到n^3?

    我只会暴力

  • -2
    @ 2009-07-17 18:52:55

    搞了整整一天的AC自动机。终于被我给A掉了。感谢上帝。。。

  • -2
    @ 2009-07-09 18:15:11

    其实出题人只是不想卡这题的高精度,这个题目有一个N三方的算法。。。

    所以这个题还是很厉害滴。。。

  • -2
    @ 2009-07-06 14:32:39

    AC自动机

    可是我不会..

  • -2
    @ 2009-07-07 00:27:33

    我要喝沙茶!!!

    是不是喝了沙茶这题就会做了~~

    我要喝冰红茶~~

    这题BT

  • -2
    @ 2009-07-05 21:52:38

    沙茶沙茶

  • -2
    @ 2009-07-05 22:05:58

    我要喝沙茶!!!

    是不是喝了沙茶这题就会做了~~

  • -2
    @ 2009-07-05 21:00:53

    我是沙茶,当时不会做……

    自从这道题后我才会AC自动机……

  • -2
    @ 2009-07-12 21:21:41

    此题终于有人做了...

    楼下说的很关键,要加个额外判断。我用楼下大牛程序提交题目时就加了这条语句。

  • -4
    @ 2009-07-06 13:28:03

    沙茶题留名:

    傻X许杰奇到此一游!

  • 1

信息

ID
1569
难度
7
分类
动态规划 | 概率论 点击显示
标签
递交数
180
已通过
35
通过率
19%
被复制
2
上传者