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; }