• hdu 1880 字符串hash


    /*普通的hsah 由于元素太多 空间很小..hash碰撞很厉害.30分*/
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<map>
    #define maxn 100010
    #define mod 2000007
    #define hs 117
    using namespace std;
    int n,l,k,cnt,f[mod+10],l1[maxn],l2[maxn];
    char s[110],c,s1[maxn][110],s2[maxn][110];
    int main()
    {
        while(1)
          {
              gets(s);if(s[0]=='@')break;
              cnt++;l=strlen(s);
              for(int i=0;i<l;i++)
                {
                    if(s[i]=='[')continue;
                    if(s[i]==']'){k=i+2;break;}
                    s1[cnt][++l1[cnt]]=s[i];
              }
              for(int i=k;i<l;i++)s2[cnt][++l2[cnt]]=s[i];
            int a1=1,a2=7;
              for(int i=1;i<=l1[cnt];i++)
              a1=a1*s1[cnt][i]*mod+s1[cnt][i]*i;
              if(a1<0)a1=-a1;a1=a1%mod;
              for(int i=1;i<=l2[cnt];i++)
               a2=a2*s2[cnt][i]*mod+s2[cnt][i]*i;
              if(a2<0)a2=-a2;a2=a2%mod;
              f[a1]=cnt;f[a2]=cnt;
          }
        cin>>n;c=getchar();
        for(int i=1;i<=n;i++)
          {
              gets(s);l=strlen(s);int li=0,falg=0;
              char si[110];memset(si,0,sizeof(si));
              for(int i=0;i<l;i++)
                {
                    if(s[i]=='['){falg=1;continue;}
                    if(s[i]==']')break;
                    si[++li]=s[i];
              }
            int ai;if(falg)ai=1;else ai=7;
            for(int i=1;i<=li;i++)
              ai=ai*si[i]*mod+si[i]*i;
              if(ai<0)ai=-ai;ai=ai%mod;
              if(f[ai]==0)printf("what?
    ");
              else 
                {
                    if(falg)
                      {
                          for(int i=1;i<=l2[f[ai]];i++)
                      printf("%c",s2[f[ai]][i]);
                          printf("
    ");
                  }
                else
                      {
                          for(int i=1;i<=l1[f[ai]];i++)
                      printf("%c",s1[f[ai]][i]);
                          printf("
    ");
                  }
              }
          }
        return 0;
    }
    /*map 爆空间.*/
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<map>
    using namespace std;
    map<string,string>f;
    int n,l,k;
    char s[110],c;
    int main()
    {
        while(1)
          {
              gets(s);
              if(s[0]=='@')break;
              string s1,s2;l=strlen(s);
              for(int i=0;i<l;i++)
                {
                    if(s[i]=='[')continue;
                    if(s[i]==']'){k=i+2;break;}
                    s1+=s[i];
              }
              for(int i=k;i<l;i++)s2+=s[i];
              f[s1]=s2;f[s2]=s1;
          }
        cin>>n;c=getchar();
        for(int i=1;i<=n;i++)
          {
              gets(s);
              string s1,s2;l=strlen(s);
              for(int i=0;i<l;i++)
                {
                    if(s[i]=='[')continue;
                    if(s[i]==']')break;
                    s1+=s[i];
              }
              if(f[s1]=="")cout<<"what?"<<endl;
              else cout<<f[s1]<<endl;
          }
        return 0;
    }
    
    
    
     
    /*我同桌的暴力 居然过了....*/
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define maxn 100010
    using namespace std;
    string ss,sss;
    char s[1010];
    char s1[maxn][50],s2[maxn][100];
    int n,tot,l1[maxn],l2[maxn];
    int main()
    {
        int i,j,k;
        while(1)
        {
            gets(s);
            if(s[0]=='@')break;
            tot++;
            int l=strlen(s);
            for(i=0;i<=l-1;i++)
            {
                s1[tot][l1[tot]++]=s[i];
                if(s[i]==']')break;
            }
            for(j=i+2;j<=l-1;j++)
                s2[tot][l2[tot]++]=s[j];
        }
        cin>>n;
        char c=getchar();
        while(n--)
        {
            gets(s);
            int l=strlen(s);
            ss=s;
            if(ss[0]=='[')
            {
                for(i=1;i<=tot;i++)
                {
                    sss=s1[i];
                    if(ss==sss)
                    {
                        cout<<s2[i]<<endl;
                        break;
                    }
                }
                if(i==tot+1)
                cout<<"what?"<<endl;
            }
            else
            {
                for(i=1;i<=tot;i++)
                {
                    sss=s2[i];
                    if(ss==sss)
                    {
                        for(j=1;j<l1[i]-1;j++)
                        cout<<s1[i][j];
                        cout<<endl;
                        break;
                    }
                }
                if(i==tot+1)
                cout<<"what?"<<endl;
            }
        }
        return 0;
    }
    /*
    后来xzc说类似边表的搞一搞就好了
    建一个图 hash值是点的编号 每个字符串是边
    每个hash可能对应好几个字符串 都连到这个hash值上
    然后查询的时候遍历这个点连出去的所有边 
    空间有点紧. 
    */ 
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<map>
    #define maxn 100010
    #define mod 100007
    #define hs 117
    using namespace std;
    struct node
    {
        char s1[22],s2[82];
        int pre;
    }A[maxn],B[maxn];
    int n,l,k,ha,cnt,heada[mod],headb[mod];
    char s[110],c,q1[110],q2[110],si[110];
    int Hash(char *a)
    {
        int ret=1,l=strlen(a);
        for(int i=0;i<l;i++)
          ret=(ret*hs%mod+a[i])%mod;
        return ret%mod;
    }
    void Insert(char *a,char *b)
    {
        cnt++;
        strcpy(A[cnt].s1,a);
        strcpy(A[cnt].s2,b);
        ha=Hash(a);
        A[cnt].pre=heada[ha];
        heada[ha]=cnt;
        strcpy(B[cnt].s1,a);
        strcpy(B[cnt].s2,b);
        ha=Hash(b);
        B[cnt].pre=headb[ha];
        headb[ha]=cnt;
    }
    int find1(char *a)
    {
        ha=Hash(a);
        for(int i=heada[ha];i;i=A[i].pre)
          if(!strcmp(A[i].s1,a))return i;
        return 0;
    }
    int find2(char *a)
    {
        ha=Hash(a);
        for(int i=headb[ha];i;i=B[i].pre)
          if(!strcmp(B[i].s2,a))return i;
        return 0;
    }
    int main()
    {
        while(1)
          {
              memset(q1,0,sizeof(q1));
              memset(q2,0,sizeof(q2));
              gets(s);if(s[0]=='@')break;
              l=strlen(s);
              int l1=-1,l2=-1;
              for(int i=0;i<l;i++)
                {
                    if(s[i]=='[')continue;
                    if(s[i]==']'){k=i+2;break;}
                    q1[++l1]=s[i];
              }
              for(int i=k;i<l;i++)q2[++l2]=s[i];
              Insert(q1,q2);
          }
        cin>>n;c=getchar();
        for(int i=1;i<=n;i++)
          {
              gets(s);l=strlen(s);int li=-1,falg=0;
              for(int i=0;i<l;i++)
                {
                    if(s[i]=='['){falg=1;continue;}
                    if(s[i]==']')break;
                    si[++li]=s[i];
              }
              if(falg)
              {
                  int r=find1(si);
                !r?cout<<"what?"<<endl:cout<<A[r].s2<<endl;
              }
            else 
              {
                  int r=find2(si);
                !r?cout<<"what?"<<endl:cout<<B[r].s1<<endl;
              }
          }
        return 0;
    }
  • 相关阅读:
    [leedcode 104] Maximum Depth of Binary Tree
    [leedcode 103] Binary Tree Zigzag Level Order Traversal
    [leedcode 102] Binary Tree Level Order Traversal
    [leedcode 101] Symmetric Tree
    [leedcode 100] Same Tree
    [leedcode 99] Recover Binary Search Tree
    深入理解java虚拟机---内存分配策略(十三)
    jmeter4.0 源码编译 二次开发
    jmeter源码导入eclipse并执行
    深入理解java虚拟机---垃圾回收(十一)
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5750948.html
Copyright © 2020-2023  润新知