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;
}
原文地址:https://www.cnblogs.com/liulangye/p/2508192.html