• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            學習心得(code)

            superlong@CoreCoder

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              74 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

            公告

            文字可能放在http://blog.csdn.net/superlong100,此處存放代碼

            常用鏈接

            留言簿(4)

            我參與的團隊

            搜索

            •  

            最新隨筆

            最新評論

            • 1.?re: Poj 1279
            • 對于一個凹多邊形用叉積計算面積 后能根據(jù)結果的正負來判斷給的點集的時針方向?
            • --bsshanghai
            • 2.?re: Poj 3691
            • 你寫的這個get_fail() 好像并是真正的get_fail,也是說fail指向的串并不是當前結點的子串。為什么要這樣弄呢?
            • --acmer1183
            • 3.?re: HDU2295[未登錄]
            • 這個是IDA* 也就是迭代加深@ylfdrib
            • --superlong
            • 4.?re: HDU2295
            • 評論內容較長,點擊標題查看
            • --ylfdrib
            • 5.?re: HOJ 11482
            • 呵呵..把代碼發(fā)在這里很不錯..以后我也試試...百度的編輯器太爛了....
            • --csuft1

            閱讀排行榜

            評論排行榜

             

            #include <iostream>
            #include 
            <string.h>
            using namespace std;

            #define MAXN 100
            #define FAIL 0

            int trans[MAXN][26];
            bool terminal[MAXN];
            int S[MAXN];
            int vex;

            const int mod = 10007;

            void init() {
                fill(trans[
            1], trans[vex + 1], FAIL);
                fill(terminal, terminal 
            + vex + 1false);
                vex 
            = 1;
            }


            void trie(char *p) {
                
            int cur = 1, ch;    
                
            while (*!= '\0'{
                    ch 
            = *(p++- 'A';
                    
            if (trans[cur][ch] == FAIL) trans[cur][ch] = ++vex;
                    cur 
            = trans[cur][ch];
                }

                terminal[cur] 
            = true;
            }


            void build_ac() {
                
            int Q[MAXN], f, r;
                f 
            = r = 0;
                S[
            1= FAIL;
                Q[r
            ++= 1;
                
                
            while (f < r) {
                    
            int cur = Q[f++];        
                    
            for (int i = 0; i < 26; i++{
                        
            int next = trans[cur][i];            
                        
            if (next != FAIL) {
                            
            if (cur == 1) S[next] = cur;
                            
            else S[next] = trans[S[cur]][i];                
                            
            if (terminal[S[next]]) terminal[next] = true;
                            
                            Q[r
            ++= next;
                        }
             else {
                            
            if (cur == 1) trans[cur][i] = 1;
                            
            else trans[cur][i] = trans[S[cur]][i];
                        }

                    }

                }

            }


            typedef 
            int MATR[MAXN][MAXN];
            MATR omat;
            int n;

            int conv[MAXN];
            int getid(int cur) {
                
            if (conv[cur] == -1) conv[cur] = n++;
                
            return conv[cur];
            }



            void calmat() {
                
            int i, j, ch, cur, next;
                memset(omat, 
            0sizeof(omat));
                
                fill(conv, conv 
            + vex + 1-1);
                n 
            = 0;
                
            for (cur = 1; cur <= vex; cur++{
                    
            if (terminal[cur]) continue;
                    i 
            = getid(cur);
                    
                    
            for (ch = 0; ch < 26; ch++{                
                        next 
            = trans[cur][ch];
                        
            if (terminal[next]) continue;            
                        j 
            = getid(next);            
                        
            if (next != FAIL) omat[i][j]++;        
                    }

                }
                
            }





            void matmul(MATR a, MATR b, MATR c, int n) {
                
            int i, j, k;
                
                
            for (i = 0; i < n; i++{
                    
            for (j = 0; j < n; j++{
                        c[i][j] 
            = 0;
                        
            for (k = 0; k < n; k++)
                            c[i][j] 
            += a[i][k] * b[k][j];
                        c[i][j] 
            %= mod;
                    }
                                
                }

            }


            void matpow(MATR a, MATR c, int m) //a^m
                if (m == 1{
                    memcpy(c, omat,
            sizeof(MATR));
                    
            return;
                }

                
                matpow(c, a, m
            /2);
                matmul(a, a, c, n);
                
                
            if (m & 1{
                    matmul(c, omat, a, n);
                    memcpy(c, a, 
            sizeof(MATR));
                }
                
            }


            int modpow(int a, int m) {    
                
            if (m == 1return a % mod;
                
                
            int tmp = modpow(a, m/2);
                tmp 
            = tmp * tmp % mod;
                
                
            if (m & 1) tmp = tmp * a % mod;
                
            return tmp;
            }


            int main() {
            #ifdef _DEBUG
                freopen(
            "in.txt""r", stdin);
            #endif
                
                
            int m, len, i;
                
            char buf[100];
                
                
            while (scanf("%d%d"&m, &len) != EOF) {
                    init();
                    
            for (i = 0; i < m; i++{
                        scanf(
            "%s", buf);
                        trie(buf);
                    }

                    build_ac();
                    calmat();
                    MATR tmp, res;
                    matpow(tmp, res, len);

                    
            int bad = 0;
                    
            for (i = 0; i < n; i++) bad -= res[0][i];
                    
                    bad 
            = (bad % mod + mod) % mod;        
                    
            int total = modpow(26, len);
                    
                    printf(
            "%d\n", (total + bad) % mod);
                }

                
                
            return 0;
            }



            版本2

            #include <stdio.h>
            #include <string.h>
            #define R 27
            #define N 100
            #define M 10007
            typedef int LL;

            int tree[N][R], flag[N], fail[N], state;

            void init(){
                memset(tree, -1, sizeof(tree));
                memset(flag, 0, sizeof(flag));
                memset(fail, -1, sizeof(fail));
                flag[0] = 0;
                state = 1;
            }
            void insert(char ch[]) {
                int p = 0, i = 0, t;
                while(ch[i]) {
                    t = ch[i] - 'A' + 1;
                    if(tree[p][t] < 0) tree[p][t] = state++;
                    p = tree[p][t], i ++;
                }
                flag[p] = 1;
            }

            int que[N];

            void get_fail() {
                int close = -1, open = 0, next;
                que[0] = 0;
                fail[0] = -1;
                while(close < open) {
                    int p = que[++close];
                    for(int i = 0; i < R; i ++) {
               next = tree[p][i];
                        if(next == -1){
                            if(p == 0)  tree[p][i] = 0;
                            else        tree[p][i] = tree[fail[p]][i];
                        } else {
                            if(p == 0)  fail[next] = 0;
                            else        fail[next] = tree[fail[p]][i];
                            if(flag[fail[next]]) flag[next] = true;
                            que[++open] = next;
                        }
                    }
                }
            }
            int n, L;
            LL f[N][N], sum = 0;

            void mod_multi(LL a[N][N], LL b[N][N], int r){
                int i, j, k;
                LL c[N][N] = {};
                for (k = 0; k < r; k++)
                    for (i = 0; i < r; i++)
                        if(a[i][k])
                        for (j = 0; j < r; j++){
                            c[i][j] += a[i][k] * b[k][j];
                            c[i][j] %= M;
                        }
                for (i = 0; i < r; i++)
                    for (j = 0; j < r; j++)
                        a[i][j] = c[i][j];
            }

            void mod_exp(LL a[N][N], LL n, int r){
                int i, j, k;
                LL ans[N][N] = {};
                for (i = 0; i < r; i++)ans[i][i] = 1;
                for (; n; n >>= 1){
                    if (n & 1)
                        mod_multi(ans, a, r);
                    mod_multi(a, a, r);
                }
                for (i = 0; i < r; i++)
                    for (j = 0; j < r; j++)
                        a[i][j] = ans[i][j];
            }

            LL fast(LL sum, int L) {
                LL temp = 1ll;
                for(;L;L >>= 1) {
                    if(L&1) {
                        temp *= sum;
                        temp %= M;
                    }
                    sum *= sum;
                    sum %= M;
                }
                return temp;
            }

            int main() {
                while(scanf("%d %d\n", &n ,&L) != EOF) {
                    char str[7];
                    init();
                    for(int i = 0; i < n; i ++) {
                        gets(str);
                        insert(str);
                    }
                    get_fail();
                    int map[N], cnt = 0, next;
                    memset(map,-1,sizeof(map));
                    memset(f, 0, sizeof(f));
                    for(int i = 0; i < state; i ++) {
                        if(flag[i]) continue;
                        for(int j = 1; j < R; j ++) {
                next = tree[i][j];
                            if(flag[next]) 
                 continue;
                            if(map[i] == -1) map[i] = cnt ++;
                            if(map[next] == -1) map[next]  = cnt ++;
                            f[map[i]][map[next]] ++; 
                        }
                    }
                    mod_exp(f, L, cnt);
                    LL ans = 0;
                    for(int i = 0; i < cnt; i ++) ans += f[0][i];
              ans %= M;
                    sum = fast(26, L);
                    printf("%d\n", (sum + M - ans) % M);
                }
            }



            posted on 2009-10-27 01:50 superlong 閱讀(326) 評論(0)  編輯 收藏 引用
            超级碰久久免费公开视频| 国产精品视频久久| 国产叼嘿久久精品久久| 国产精品久久久久天天影视| 久久久www免费人成精品| 无码人妻久久一区二区三区蜜桃 | 久久久久久久91精品免费观看| 色综合久久最新中文字幕| 97久久精品午夜一区二区| 久久国产精品久久| 91精品观看91久久久久久 | 漂亮人妻被黑人久久精品| 国产69精品久久久久APP下载| 久久免费视频1| 午夜天堂精品久久久久| 国产亚洲精久久久久久无码| 久久香蕉国产线看观看99| 99久久免费只有精品国产| 久久久99精品一区二区| 久久精品国产亚洲av麻豆图片| 亚洲日韩中文无码久久| 成人资源影音先锋久久资源网| 国产福利电影一区二区三区久久久久成人精品综合 | 无码久久精品国产亚洲Av影片| 国产精品99久久免费观看| 国产叼嘿久久精品久久| 久久人妻AV中文字幕| 精品久久久无码人妻中文字幕豆芽 | 久久夜色精品国产噜噜亚洲a| 精品久久久无码21p发布 | AAA级久久久精品无码区| 欧美一级久久久久久久大| 中文字幕久久波多野结衣av| 青青国产成人久久91网| 久久久久久久波多野结衣高潮| 久久Av无码精品人妻系列| 国产精品激情综合久久| 亚洲αv久久久噜噜噜噜噜| 一本久久a久久精品综合夜夜| 狠狠色婷婷久久综合频道日韩| 国产高潮国产高潮久久久91|