zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    OPPO R9sPlus MIFlash线刷TWRP Recovery ROOT详细教程
    OPPO R11 R11plus系列 解锁BootLoader ROOT Xposed 你的手机你做主
    努比亚(nubia) M2青春版 NX573J 解锁BootLoader 并进入临时recovery ROOT
    华为 荣耀 等手机解锁BootLoader
    青橙 M4 解锁BootLoader 并刷入recovery ROOT
    程序员修炼之道阅读笔03
    冲刺8
    典型用户模板分析
    学习进度八
    冲刺7
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5750948.html
Copyright © 2011-2022 走看看