Organize Your Train part II POJ 3007 (哈希&链式解决冲突)

来源:互联网 发布:nodejs 面向对象编程 编辑:程序博客网 时间:2024/06/10 10:26

题目大意:将一个字符串分解成任意的两部分,且两部的串及其反串相互组合,看能有多少种组合方式。

思路:(用map超时- -,结果换成哈希险过)。

#include<map>#include<queue>#include<cmath>#include<iostream>#include<cstdio>#include<stack>#include<cstring>#include<algorithm>#include<string>#define inf 0x3f3f3f3f#define eps 1e-5using namespace std;const double PI=acos(-1.0);char s[100],s1[100],s2[100],z[100],s3[100],s4[100];struct node{    char str[82];    node *next;}*Hash[100003];int ans;void Inset(char str[]){    int l=strlen(str);    int su=0;    for(int i=0;i<l;i++){        su+=s[i]*(i+1);        su%=99991;    }    //printf("%s\n",str);    if(!Hash[su]){        node *p;        p=new node;        p->next=0;        strcpy(p->str,str);        p->next=Hash[su];        Hash[su]=p;        ans++;    }    else{        node *p;        for(p=Hash[su];p;p=p->next){            if(!strcmp(p->str,str))                return ;        }        node *q;        q=new node;        q->next=0;        strcpy(q->str,str);        q->next=Hash[su];        Hash[su]=q;        ans++;    }    return ;}int main(){    int n,m,i,j,k,x,y,cla;    while(~scanf("%d",&cla)){        while(cla--){            memset(Hash,0,sizeof(Hash));            ans=0;            int sum;            scanf("%s",s);            int l=strlen(s);            for(i=1;i<l;i++){                x=y=0;                for(j=0;j<i;j++){                    s1[x++]=s[j];                }                for(j=0;j<x;j++){                    s3[x-j-1]=s1[j];                }                s1[x]='\0';s3[x]='\0';                for(j=i;j<l;j++){                    s2[y++]=s[j];                }                for(j=0;j<y;j++){                    s4[y-j-1]=s2[j];                }                s2[y]='\0';                s4[y]='\0';                for(j=0;j<8;j++){                    sum=0;                    if(j==0){                        for(k=0;k<x;k++){                            z[sum++]=s1[k];                        }                        for(k=0;k<y;k++){                            z[sum++]=s2[k];                        }                        z[sum]='\0';                        Inset(z);                    }                    else if(j==1){                        for(k=0;k<x;k++){                            z[sum++]=s3[k];                        }                        for(k=0;k<y;k++){                            z[sum++]=s2[k];                        }                        z[sum]='\0';                        Inset(z);                    }                    else if(j==2){                        for(k=0;k<x;k++){                            z[sum++]=s1[k];                        }                        for(k=0;k<y;k++){                            z[sum++]=s4[k];                        }                        z[sum]='\0';                        Inset(z);                    }                    else if(j==3){                        for(k=0;k<x;k++){                            z[sum++]=s3[k];                        }                        for(k=0;k<y;k++){                            z[sum++]=s4[k];                        }                        z[sum]='\0';                        Inset(z);                    }                    else if(j==4){                        for(k=0;k<y;k++){                            z[sum++]=s2[k];                        }                        for(k=0;k<x;k++){                            z[sum++]=s1[k];                        }                        z[sum]='\0';                        Inset(z);                    }                    else if(j==5){                        for(k=0;k<y;k++){                            z[sum++]=s4[k];                        }                        for(k=0;k<x;k++){                            z[sum++]=s1[k];                        }                        z[sum]='\0';                        Inset(z);                    }                    else if(j==6){                        for(k=0;k<y;k++){                            z[sum++]=s2[k];                        }                        for(k=0;k<x;k++){                            z[sum++]=s3[k];                        }                        z[sum]='\0';                        Inset(z);                    }                    else if(j==7){                        for(k=0;k<y;k++){                            z[sum++]=s4[k];                        }                        for(k=0;k<x;k++){                            z[sum++]=s3[k];                        }                        z[sum]='\0';                        Inset(z);                    }                }            }            printf("%d\n",ans);        }    }    return 0;}
0 0
原创粉丝点击