zoukankan      html  css  js  c++  java
  • wenbao与字典树(二)

    http://acm.hdu.edu.cn/showproblem.php?pid=1247

     1 #include <iostream>
     2 #include <stdio.h>
     3 using namespace std;
     4 #define maxn 50
     5 char a[50005][60];
     6 struct Node{
     7     int flag;
     8     Node *next[maxn];
     9     Node(){
    10         flag=0;
    11         for(int i=0; i<maxn; i++)
    12             next[i]=NULL;
    13     }
    14 } N;
    15 
    16 void add(char x[]){
    17     Node *p=&N;
    18     for(int i=0; x[i]; i++){
    19         int xx=x[i]-'a';
    20         if(p->next[xx]==NULL)
    21             p->next[xx]=new Node;
    22         p=p->next[xx];
    23     }
    24     p->flag=1;
    25 }
    26 
    27 int findn(char x[]){
    28     Node *q=&N;
    29     for(int i=0; x[i]; i++){
    30         int xx=x[i]-'a';
    31         if(q->next[xx]){
    32             q=q->next[xx];
    33             if(q->flag){
    34                 int ff=1;
    35                 Node *t=&N;
    36                 for(int j=i+1; x[j]; j++){
    37                     int yy=x[j]-'a';
    38                     if(t->next[yy])
    39                         t=t->next[yy];
    40                     else{
    41                         ff=0;
    42                         break;
    43                     }
    44                 }
    45                 if(ff){
    46                     if(t->flag)
    47                         return 1;
    48                 }
    49             }
    50         }
    51     }
    52     return 0;
    53 }
    54 
    55 int main(){
    56     int n=0;
    57     while(~scanf("%s",a[n])){
    58         add(a[n]);
    59         n++;
    60     }
    61     for(int i=0; i<n; i++){
    62         if(findn(a[i]))
    63             printf("%s
    ",a[i]);
    64     }
    65     return 0;
    66 }

    看心情更新,啦啦啦啦啦啦~~~~

     1 #include <iostream>
     2 #include <string.h>
     3 #include <stdio.h>
     4 using namespace std;
     5 const int maxn = 50010;
     6 char str[maxn][50];
     7 int n = 0, num = 1, m = 0, tree[maxn*4][30], flag[maxn*4];
     8 void add(){
     9     int node = 0;
    10     for(int i = 0; str[n][i]; i++){
    11         int xx = str[n][i] - 'a';
    12         if(!tree[node][xx]) tree[node][xx] = num++;
    13         node = tree[node][xx];
    14     }
    15     flag[node] = 1;
    16 }
    17 bool query(){
    18     int node = 0, len = strlen(str[m]);
    19     for(int i = 0; str[m][i]; i++){
    20         int xx = str[m][i] -'a';
    21         node = tree[node][xx];
    22         if(flag[node]){
    23             int node2 = 0, j;
    24             for(j = i+1; str[m][j]; j++){
    25                 int xxx = str[m][j] -'a';
    26                 if(!tree[node2][xxx]) break;
    27                 node2 = tree[node2][xxx];
    28             }
    29             if(j == len && flag[node2]) return true;
    30         }
    31     }
    32     return false;
    33 }
    34 int main(){
    35     while(~scanf("%s", str[n])){
    36         add(), n++;
    37     }
    38     while(n--){
    39         if(query()){
    40             printf("%s
    ", str[m]);
    41         }
    42         m++;
    43     }
    44     return 0;
    45 }

    ------------------------------------------------------------------------

    http://acm.hdu.edu.cn/showproblem.php?pid=1277

    将关键字建立字典树

     1 #include <iostream>
     2 using namespace std;
     3 int n, m, cnt = 0;
     4 char str[60009], ss[69];
     5 int vis[700000], sum[700000][26];
     6 bool mark[700000], flag = false;
     7 void in(int x){
     8     int root = 0;
     9     for(int i = 0; ss[i]; ++i){
    10         int xx = ss[i]-'0';
    11         if(!sum[root][xx]) sum[root][xx] = cnt++;
    12         root = sum[root][xx];
    13     }
    14     vis[root] = x;
    15 }
    16 void f(int x){
    17     int root = 0;
    18     for(int i = x; str[i] != ''; ++i){
    19         int xx = sum[root][str[i]-'0'];
    20         if(!xx) return;
    21         if(vis[xx] && !mark[xx]){
    22             if(!flag){
    23                 printf("Found key: [Key No. %d]", vis[xx]);
    24                 flag = true;
    25             }else{
    26                 printf(" [Key No. %d]", vis[xx]);
    27             }
    28             mark[xx] = true;
    29         }
    30         root = xx;
    31     }
    32 }
    33 int main(){
    34     scanf("%d%d", &n, &m);
    35     getchar();
    36     char c;
    37     int nn = 0, num = 0;
    38     c = getchar();
    39     while(true){
    40         if(c == '
    '){
    41             nn++;
    42             if(nn == n) break;
    43             c = getchar();
    44             continue;
    45         }
    46         str[num++] = c;
    47         c = getchar();
    48     }
    49     str[num] = '';
    50     getchar();
    51     char tp[5];
    52     for(int i = 1; i <= m; ++i){
    53         scanf(" %s%s%s%s", tp, tp, tp, ss);
    54         in(i);
    55     }
    56     for(int i = 0; str[i] != ''; ++i){
    57         f(i);
    58     }
    59     if(!flag) printf("No key can be found !
    ");
    60     else printf("
    ");
    61     return 0;
    62 }

    ---------------------------------------------

    http://codeforces.com/contest/842/problem/D

    全局异或求mex

     1 #include <iostream>
     2 using namespace std;
     3 
     4 const int maxn = 3e5+10;
     5 const int maxr = 6e6+10;
     6 int num = 1, a[maxr][2], sum[maxr];
     7 bool vis[maxn];
     8 
     9 void add(int x){
    10     int root = 1;
    11     for(int i = 31; i >= 0; --i){
    12         int id = ((x>>i)&1);
    13         if(!a[root][id]) a[root][id] = ++num;
    14         root = a[root][id];
    15         sum[root] ++;
    16     }
    17 }
    18 
    19 int q(int x){
    20     int root = 1, cnt = 0;
    21     for(int i = 31; i >= 0; --i){
    22         int id = ((x>>i)&1);
    23         if(!a[root][id]) return cnt;
    24         if(sum[a[root][id]] == (1<<i)){
    25             root = a[root][1-id], cnt |= (1<<i);
    26         }else{
    27             root = a[root][id];
    28         }
    29     }
    30     return cnt;
    31 }
    32 
    33 int main(){
    34     int n, m, x, y = 0;
    35     scanf("%d%d", &n, &m);
    36     for(int i = 0; i < n; ++i){
    37         scanf("%d", &x);
    38         if(!vis[x]) vis[x] = true, add(x);
    39     }
    40     while(m--){
    41         scanf("%d", &x);
    42         y ^= x;
    43         printf("%d
    ", q(y));
    44     }
    45     return 0;
    46 }

    ------------------------------------------

    只有不断学习才能进步!

  • 相关阅读:
    connot connect to mysql 10061
    <context:annotation-config/>,<mvc:annotation-driven/>和<context:component-scan>之间的关系
    Failed to read artifact descriptor for xxx:jar的问题解决
    URI is not registered ( Setting | Project Settings | Schemas and DTDs )
    MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring
    springmvc.xml,context.xml和web.xml
    web.xml
    Spring配置文件XML详解
    springmvc配置文件
    Android设置窗口、控件透明度
  • 原文地址:https://www.cnblogs.com/wenbao/p/5692966.html
Copyright © 2011-2022 走看看