zoukankan      html  css  js  c++  java
  • Repository HDU2846

    极限过的 最原始的方法一层一层建树就好了

    #include<bits/stdc++.h>
    using namespace std;
    
    int  trie[500100][26]={0};
    int  sum[500100]={0};
    bool flag[500100];
    
    int root=0;
    int pos;
    void insert1(char *s)
    {
        int root=0;
        for(int i=0;i<strlen(s);i++)
        {   int ch=s[i]-'a';
            if( trie[ root ][ch]==0  )
              {
                // memset(trie[pos],0,sizeof(trie[pos]));//用多少初始化多少
                 trie[root][ch]=pos++;
              }
            root=trie[root][ch];
            if( !flag[root] ){flag[root]=true;sum[root]++;}
        }
    
    }
    int find1(char *s)
    {
        int root=0;
        for(int i=0;i<strlen(s);i++)
        {
            int ch=s[i]-'a';
            if( trie[root][ch]==0 )return 0;
            root=trie[root][ch];
    
        }
    
        return sum[root];
    
    }
    
    int main()
    {
      pos=1;
      int n;scanf("%d",&n);
      char a[20];char s[20];
      while(n--)
      {
          memset(flag,false,sizeof(flag));
          scanf("%s",a);
          int n1=strlen(a);
          for(int k=0;k<n1;k++)
          {
             strcpy( s , a+k );
             insert1(s);
          }
    
      }
      scanf("%d",&n);
      while(n--)
      {
          scanf("%s",a);
          printf("%d
    ",find1(a));
      }
    
    return 0;
    }

    优化了:  时间节省了600ms

    1.去掉flag标记数组 改sum为二维数组  更加方便  学会了标记数组不是只有0,1那么死板 多观察就可以不用memset 节省了大量时间!!!

    2.直接 a+k带入  不用strcpy到另外一个数组里去了

    #include<bits/stdc++.h>
    using namespace std;
    
    int  trie[500100][26]={0};
    int  sum[500100][2]={0};
    bool flag[500100];
    
    int root=0;
    int pos;
    void insert1(char *s,int id)
    {
        int root=0;
        for(int i=0;i<strlen(s);i++)
        {   int ch=s[i]-'a';
            if( trie[ root ][ch]==0  )
              {
                // memset(trie[pos],0,sizeof(trie[pos]));//用多少初始化多少
                 trie[root][ch]=pos++;
              }
            root=trie[root][ch];
            if(  sum[root][1]!=id   ){sum[root][1]=id;sum[root][0]++;}
        }
    
    }
    int find1(char *s)
    {
        int root=0;
        for(int i=0;i<strlen(s);i++)
        {
            int ch=s[i]-'a';
            if( trie[root][ch]==0 )return 0;
            root=trie[root][ch];
    
        }
    
        return sum[root][0];
    
    }
    
    int main()
    {
      pos=1;
      int n;scanf("%d",&n);
      char a[20];
      while(n--)
      {
    
          scanf("%s",a);
          int n1=strlen(a);
          for(int k=0;k<n1;k++)
          {
    
             insert1(a+k,n);
          }
    
      }
      scanf("%d",&n);
      while(n--)
      {
          scanf("%s",a);
          printf("%d
    ",find1(a));
      }
    
    return 0;
    }
    View Code
  • 相关阅读:
    【转】当你输入一个网址的时候,实际会发生什么?
    opencv 操作本地摄像头实现录像
    谷歌笔试题——排序,只允许0和其他元素交换
    判断素数的相关代码
    VS2010 代码自动对齐 快捷键
    谷歌的一道面试题
    各种排序算法代码汇总
    冒泡排序
    lua环境变量
    lua迭代
  • 原文地址:https://www.cnblogs.com/bxd123/p/10346313.html
Copyright © 2011-2022 走看看