zoukankan      html  css  js  c++  java
  • poj 3007 Organize Your Train part II 夜

    http://poj.org/problem?id=3007

    用STL 会超时 用哈希哟

    本题哈希很简单,主要是字符串可能出现的各种情况处理起来有点复杂

    #include<iostream>
    #include<cmath>
    #include<string>
    #include<algorithm>
    #include<queue>
    #include<map>
    #include<set>
    #include<cstring>
    #include<cstdio>
    
    using namespace std;
    
    const int N=10002;//不能过大 小心超时
    const int M=100;
    struct node
    {
        char s[M];
    }mem[N];
    bool had[N];
    int ans;
    void Shash(char a[],int n)//哈希  
    {
        int k=1;
        a[n]='\0';
        for(int i=0;i<n;++i)
        k=k+((n-i)*(a[i]-'a'));
        while(1)//哈希寻找 
        {
            if(had[k%N]==true)
            {
                if(strcmp(mem[k%N].s,a)==0)
                break;
                ++k;
            }
            else
            {
                had[k%N]=true;
                ++ans;
                strcpy(mem[k%N].s,a);
                break;
            }
        }
    }
    int main()
    {
        int T;
        char a[M],b[M];
        scanf("%d",&T);
        getchar();
        while(T--)
        {
            memset(had,false,sizeof(had));
            gets(a);
            ans=0;
            //puts(a);
            int n=strlen(a);
            Shash(a,n);
            for(int i=1;i<n;++i)
            {
                 for(int l=0,j=i;l<n;++l,++j)
                 {
                     b[l]=a[j%n];
                 }
                 Shash(b,n);
                 for(int l=0;l<i/2;++l)
                 swap(a[l],a[i-l-1]);
                 Shash(a,n);
                 for(int l=0,j=i;l<n;++l,++j)
                 {
                     b[l]=a[j%n];
                 }
                 Shash(b,n);
                 for(int l=i;l<(n+i)/2;++l)
                 swap(a[l],a[n+i-l-1]);
                 Shash(a,n);
                 for(int l=0,j=i;l<n;++l,++j)
                 {
                     b[l]=a[j%n];
                 }
                 Shash(b,n);
                 for(int l=0;l<i/2;++l)
                 swap(a[l],a[i-l-1]);
                 Shash(a,n);
                 for(int l=0,j=i;l<n;++l,++j)
                 {
                     b[l]=a[j%n];
                 }
                 Shash(b,n);
                 for(int l=i;l<(n+i)/2;++l)
                 swap(a[l],a[n+i-l-1]);
            }
            printf("%d\n",ans);
        }
    
        return 0;
    }
    
  • 相关阅读:
    实验4
    实验3
    第七章例7-14
    第七章例7-13
    第七章例7-12
    第七章例7-11
    第七章例7-10
    diyiti
    disanti
    第二题
  • 原文地址:https://www.cnblogs.com/liulangye/p/2508192.html
Copyright © 2011-2022 走看看