POJ 3007 Organize Your Train part II map与字典树的比较

来源:互联网 发布:手机声音放大器软件 编辑:程序博客网 时间:2024/05/16 08:50

点击打开链接

给定一个字符串,从任意位置把它切为两半,得到两条子串

定义 子串1为s1,子串2为s2,子串1的反串为s3,子串2的反串为s4

现在从s1 s2 s3 s4中任意取出两个串组合,问有多少种不同的组合方法

 

规定:

(1)       串Si不能和其 反串 组合

(2)       Si+Sj 与 Sj+Si 是两种组合方式(但未必是不同的组合方式)

///字典树 时间283MS#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<cmath>#include<algorithm>#include<queue>#include<set>#include<map>#define PI acos(-1)#define eps 0.00000001#define LL long longusing namespace std;struct node{    int flag;    int next[26];}p[610000];int top;int Creat(){    memset(p[top].next,-1,sizeof(p[top].next));    p[top].flag=0;    return top++;}int Build(char s[]){    int k=0;    int len=strlen(s);    for(int i=0;i<len;i++)    {        int ch = s[i]-'a';        if(p[k].next[ch]==-1)            p[k].next[ch]=Creat();        k=p[k].next[ch];    }    p[k].flag=1;}int Find(char s[]){    int k=0;    int len=strlen(s);    for(int i=0;i<len;i++)    {        int ch = s[i]-'a';        if(p[k].next[ch]==-1)            return 0;        k=p[k].next[ch];    }    return p[k].flag;}int main(){    string c;    char s[100],s1[100],s2[100],s3[100],s4[100],s5[100],s6[100],s7[100];    int n;    while(~scanf("%d",&n))    {        while(n--)        {            top=0;            scanf("%s",s);            int len=strlen(s);            int geshu=0;           /// map<string,bool>Q;            geshu++;            ///Q[s]=1;            int k=Creat();            Build(s);            for(int i=1; i<len; i++)            {                int num=0,num1=0;                for(int j=0; j<i; j++)                {                    s1[num]=s[j];             ///12                    s2[num]=s[i-j-1];      /// 21                    s3[num++]=s[i-j-1];      /// 21                }                for(int j=i; j<len; j++)                {                    s1[num]=s[len-1-j+i];       ///12 43                    s3[num]=s[len-1-j+i];       ///21 43                    s2[num++]=s[j];            /// 21  34                    s4[num1]=s[j];             ///34                    s5[num1]=s[j];             ///34                    s6[num1]=s[len-1-j+i];       /// 43                    s7[num1++]=s[len-1-j+i];    /// 43                }                  for(int j=0; j<i; j++)                {                    s4[num1]=s[j];             ///34 12                    s5[num1]=s[i-j-1];        /// 34 21                    s6[num1]=s[j];             /// 43 12                    s7[num1++]=s[i-j-1];      /// 43 21                }                s7[num]=s6[num]=s5[num]=s4[num]=s1[num]=s2[num]=s3[num]='\0';              ///  c=s1;                ///不将char[]转变成string  然后再map[] 就会超时                if(!Find(s1))                {                   // cout<<"s1"<<s1<<endl;                    geshu++;                    Build(s1);                }                if(!Find(s2))                { //cout<<"s2"<<s2<<endl;                    geshu++;                    Build(s2);                }                if(!Find(s3))                { //cout<<"s3"<<s3<<endl;                    geshu++;                    Build(s3);                }                  if(!Find(s4))                { //cout<<"s4"<<s4<<endl;                    geshu++;                    Build(s4);                }                  if(!Find(s5))                { //cout<<"s5"<<s5<<endl;                    geshu++;                   Build(s5);                }                  if(!Find(s6))                { //cout<<"s6"<<s6<<endl;                    geshu++;                   Build(s6);                }                  if(!Find(s7))                { //cout<<"s7"<<s7<<endl;                    geshu++;                    Build(s7);                }            }            printf("%d\n",geshu);        }    }    return 0;}

///map 容器 938MS ///必须 先将char[]转化为string类型 然后再map 否则会超时#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<cmath>#include<algorithm>#include<queue>#include<set>#include<map>#define PI acos(-1)#define eps 0.00000001#define LL long longusing namespace std;int main(){    string c;    char s[100],s1[100],s2[100],s3[100],s4[100],s5[100],s6[100],s7[100];    int n;    while(~scanf("%d",&n))    {        while(n--)        {            scanf("%s",s);            int len=strlen(s);            int geshu=0;            map<string,bool>Q;            geshu++;            Q[s]=1;            for(int i=1; i<len; i++)            {                int num=0,num1=0;                for(int j=0; j<i; j++)                {                    s1[num]=s[j];             ///12                    s2[num]=s[i-j-1];      /// 21                    s3[num++]=s[i-j-1];      /// 21                }                for(int j=i; j<len; j++)                {                    s1[num]=s[len-1-j+i];       ///12 43                    s3[num]=s[len-1-j+i];       ///21 43                    s2[num++]=s[j];            /// 21  34                    s4[num1]=s[j];             ///34                    s5[num1]=s[j];             ///34                    s6[num1]=s[len-1-j+i];       /// 43                    s7[num1++]=s[len-1-j+i];    /// 43                }                  for(int j=0; j<i; j++)                {                    s4[num1]=s[j];             ///34 12                    s5[num1]=s[i-j-1];        /// 34 21                    s6[num1]=s[j];             /// 43 12                    s7[num1++]=s[i-j-1];      /// 43 21                }                s7[num]=s6[num]=s5[num]=s4[num]=s1[num]=s2[num]=s3[num]='\0';                c=s1;  ///必须 先将char[]转化为string类型 然后再map 否则会超时                if(!Q[c])                {                   // cout<<"s1"<<s1<<endl;                    geshu++;                    Q[c]=true;                }                c=s2;                if(!Q[c])                { //cout<<"s2"<<s2<<endl;                    geshu++;                    Q[c]=true;                }                c=s3;                if(!Q[c])                { //cout<<"s3"<<s3<<endl;                    geshu++;                    Q[c]=true;                }                c=s4;                  if(!Q[c])                { //cout<<"s4"<<s4<<endl;                    geshu++;                    Q[c]=true;                }                c=s5;                  if(!Q[c])                { //cout<<"s5"<<s5<<endl;                    geshu++;                    Q[c]=true;                }                c=s6;                  if(!Q[c])                { //cout<<"s6"<<s6<<endl;                    geshu++;                    Q[c]=true;                }                c=s7;                  if(!Q[c])                { //cout<<"s7"<<s7<<endl;                    geshu++;                    Q[c]=true;                }            }            printf("%d\n",geshu);        }    }    return 0;}


0 0
原创粉丝点击