程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu - 3724 - Encoded Barcodes

hdu - 3724 - Encoded Barcodes

編輯:C++入門知識

題意:有N個產品,名稱由小寫字母組成,有M個詢問,每個詢問先來一個K,再輸入K個條形碼,每個條形碼代表1個小寫字母,這K個條形碼連成連續的K個字母作為前綴,統計這個前綴是多少個產品名的前綴(重復的算多次),輸出M個詢問的統計個數和(1 <= N <= 10000, 1 <= M <= 2000, 0 < K <= 30, 產品名長度 <= 30)。
 

——>>組織好Trip後,把條形碼轉換為小寫字母(大於平均值的為1,否則為0,計算ASCII碼),連成串,在Trip查找,求和。

 

#include <cstdio>
#include <cstring>

using namespace std;

const int maxn = 30 + 5;
const int maxb = 8 + 5;
int N, M, K, bit[maxb];
double bar[maxb];
char qus[maxn];

struct node{
    int cnt;
    node *next[26];
    node(){
        cnt = 0;
        memset(next, 0, sizeof(next));
    }
};

struct Trip{
    node *root;
    int ret;

    Trip(){
        root = new node;
        ret = 0;
    }

    int idx(char c){
        return c - 'a';
    }

    void insert(char *s){
        int len = strlen(s), i;
        node *t = root;
        for(i = 0; i < len; i++){
            int c = idx(s[i]);
            if(!t->next[c]) t->next[c] = new node;
            t->next[c]->cnt++;
            t = t->next[c];
        }
    }

    void solve(){
        node *t = root;
        int len = strlen(qus), i;
        for(i = 0; i < len; i++){
            int c = idx(qus[i]);
            if(!t->next[c]) break;
            t = t->next[c];
        }
        if(i == len) ret += t->cnt;
    }

    void print(){
        printf("%d\n", ret);
    }
};

int main()
{
    char product[maxn];
    int i, j, k;
    while(scanf("%d%d", &N, &M) == 2){
        Trip trip;
        for(i = 0; i < N; i++) {
            scanf("%s", product);
            trip.insert(product);
        }
        for(i = 0; i < M; i++){
            int cnt = 0;
            scanf("%d", &K);
            for(j = 0; j < K; j++){
                double sum = 0;
                for(k = 0; k < 8; k++){
                    scanf("%lf", &bar[k]);
                    sum += bar[k];
                }
                sum /= 8;
                int ASCII = 0;
                for(k = 0; k < 8; k++) if(bar[k] > sum) ASCII += (1 << (7-k));
                qus[cnt++] = (char)ASCII;
            }
            qus[cnt] = '\0';
            trip.solve();
        }
        trip.print();
    }
    return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved