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
  • 相关阅读:
    linux   截取时间段的日志
    Linux 通过 shell 脚本修改密码
    Centos7下安装netstat
    正文字体大小:大 中 小 解决configure: error: Cannot find libmysqlclient under /usr
    隐藏index.php
    编译安装php Cannot find MySQL header files under /usr/include/mysql.
    解决问题 “You don't have permission to access /index.html on this server.”
    Linux Samba服务器配置
    PHP curl传输文件的版本兼容性
    消息队列feed程序实现中的问题
  • 原文地址:https://www.cnblogs.com/bxd123/p/10346313.html
Copyright © 2011-2022 走看看