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;

}

 

你可能感兴趣的:(part)