Fibonacci 單詞

Fibonacci單詞定義與Fibonacci數的定義類似:
FIB(1)=b,FIB(2)=a,FIB(k+2)=FIB(k+1)*FIB(k)(k>=1),*的意思是兩個字符串連接,所以FIB3=ab;FIB4=aba;FIB5=abaab;
現在給出一個長度最多爲30的模式串,僅含字母a或b.
計算第n個Fib單詞中含有多少個這樣的模式串.模式串在Fib單詞中的位置可以重疊.
Input
該題有多組測試數據,每組測試數據2行,第一行是單詞.第二行是n,n<=200.
Output
模式串出現的次數.
Sample Input
aba
6
Sample Output
3

對於n>12所有的都可以拆成 n =11和 n= 12 的和
設n = 11的字符串 用 b 代替, n = 12 的用 a 代替則n = 21 n = 22 和 n = 11 ,n = 12 是相同的字符串,只要處理字符串首尾連接處產生的模式匹配即可,好多重複代碼可以用函數表示。基本功能實現了。速度也沒什麼問題。超大數字只簡單用了個 256的數組.好像開大了,128就夠了

如果對於n=11,n=12 以及他們首尾連接的4種情況,字符串匹配個數爲0,那麼對於任何n>12匹配個數都爲0,下面程序沒有對此優化

int cmp(const string& s1,const string& s2)
{
    int count=0;
    s1.find(s2);
    string::size_type fd = s1.find(s2);
    while(fd != string::npos)
    {
        ++count;
        ++fd;
        fd = s1.find(s2,fd);
    }
    return count;
}
//超長數字加 n
void bignum(char* num,int n,int len)
{
    int m=0;
    for(int i=255;i>0;i--)
    {
        m = n - n/10*10;
        num[i] += m;
   
        if(num[i]>=10)
        {
            int j = i;
            while(num[j]>=10)
            {
                if(j>len)
                {
                    cout<<"越界"<<endl;
                    break;
                }
                num[j--] -= 10;
                num[j] += 1;
            }
        }
        n /= 10;
        if(n==0)
        {
            break;
        }
    }
}

//可以使用128位數組,提高效率
//超長數字相加
void bignum(char* num,char* str,int len)
{
    for(int i=255;i>0;i--)
    {
        num[i] += str[i];
        int j = i;
        while(num[j]>=10)
        {
            num[j--] -= 10;
            num[j] += 1;
        }
    }
}

void fib1(string str,int n)
{
    string f1="b";
    string f2="a";
    string f3;
    char count[256] = {0};
    string f;

    string ay;
    string a1= "b";
    string a2= "a";
    char ct[2][256] ={0};
    int cc[4] = {0};
    char ct1[256],ct2[256];

    if(n==0)
        f3=f1;
    if(n==1)
        f3=f2;
   
    int i = 0;

    int v = n / 10;
    int x = n % 10;

    if(v > 0)
    {
        for(i=2;i<12;i++)
        {
            f3 = f2 + f1;
            f1=f2;
            f2 = f3;       
        }
        bignum(ct[1],cmp(f2,str),256);
        bignum(ct[0],cmp(f1,str),256);
    }
    else
    {
         for(i=2;i<n;i++)
        {
            f3 = f2 + f1;
            f1=f2;
            f2 = f3;       
        }
          int tt = cmp(f2,str);
         cout<<tt<<endl;
        return;
    }

    string::size_type len2 = f2.length();
    string::size_type len1 = f1.length();

    string::size_type len = str.length();

    for(int i=1;i<v;i++)
    {

        int flag = 0;
        string tmp,tmp1,tmp2,tmp3,tmp4;
        const char * sa = f2.c_str();

        for(int j=i;j>1;j--)
        {
            if(flag == 2 || flag == 0)
            {
                if(sa[len2] == 'b')
                {
                    flag = 1;
                    sa = f1.c_str();
                }
            }
            else
            {
                if(sa[len1] == 'a')
                {
                    flag = 2;
                    sa = f2.c_str();
                }
            }
        }

        if(flag == 2 || flag == 0)
        {
            tmp2 = f2.substr(len2-len+1,len2);
        }
        else
        {
            tmp2 = f1.substr(len1-len+1,len1);
        }

        sa = f2.c_str();
        flag = 0;

        for(int j=i;j>1;j--)
        {   
            if(sa[0] == 'a')
            {
                sa = f2.c_str();
                flag = 2;
            }
            else
            {
                sa = f1.c_str();
                flag = 1;
            }
        }

        if(flag == 2 || flag == 0)
        {
            tmp1 = f2.substr(0,len-1);
        }
        else
        {
            tmp1 = f1.substr(0,len-1);
        }
        tmp = tmp2 + tmp1;
        cc[3] = cmp(tmp,str); 

        sa = f1.c_str();

        for(int j=i;j>1;j--)
        {   
            if(sa[0] == 'a')
            {
                sa = f2.c_str();
                flag = 2;
            }
            else
            {
                sa = f1.c_str();
                flag = 1;
            }
        }

        if(flag == 1 || flag == 0)
        {
            tmp4 = f1.substr(0,len-1);
        }
        else
        {
            tmp4 = f2.substr(0,len-1);
        }

        tmp = tmp2 + tmp4;
        cc[2] = cmp(tmp,str);  //ab連接


        sa = f1.c_str();
        flag = 0;

        for(int j=i;j>1;j--)
        {
            if(flag == 1 || flag == 0)
            {
                if(sa[len1] == 'b')
                {
                    flag = 1;
                    sa = f1.c_str();
                }
            }
            else
            {
                if(sa[len2] == 'a')
                {
                    flag = 2;
                    sa = f2.c_str();
                }
            }
        }


        if(flag == 1 || flag == 0)
        {
            tmp3 = f1.substr(len1-len+1,len1);
        }
        else
        {
            tmp3 = f2.substr(len2-len+1,len2);           
        }
        tmp = tmp3 + tmp1;  //ba
        cc[1] = cmp(tmp,str);
        tmp = tmp3 + tmp4; //bb
        cc[0] = cmp(tmp,str);



        sa = f1.c_str();

        memset(count,0,256*sizeof(char));
        while(sa)
        {   
            if(*sa == 'a')
            {
                bignum(count,ct[1],256);
            }
            else
            {
                bignum(count,ct[0],256);
            }
           
            if(!sa[1])
            {
                memcpy(ct1,count,256);
                break;
            }
            if(sa[1] == 'a' && *sa == 'a')
            {
                bignum(count,cc[3],256);
            }
            if(sa[1] == 'a' && *sa == 'b')
            {
                bignum(count,cc[1],256);
            }
            if(sa[1] == 'b' && *sa == 'a')
            {
                bignum(count,cc[2],256);

            }
            if(sa[1] == 'b' && *sa == 'b')
            {
                bignum(count,cc[0],256);
            }
            sa++;
        }

        sa = f2.c_str();
        memset(count,0,256*sizeof(char));
        while(sa)
        {   
            if(*sa == 'a')
            {
                bignum(count,ct[1],256);
            }
            else
            {
                bignum(count,ct[0],256);
            }

            if(!sa[1])
            {
                memcpy(ct2,count,256);
                break;
            }
            if(sa[1] == 'a' && *sa == 'a')
            {
                bignum(count,cc[3],256);

            }
            if(sa[1] == 'a' && *sa == 'b')
            {
                bignum(count,cc[1],256);

            }
            if(sa[1] == 'b' && *sa == 'a')
            {
                bignum(count,cc[2],256);

            }
            if(sa[1] == 'b' && *sa == 'b')
            {
                bignum(count,cc[0],256);
            }
            sa++;
        }
        memcpy(ct[1],ct2,256);
        memcpy(ct[0],ct1,256);
    }


    if( x-2 > 0)
    {
        memset(count,0,256*sizeof(char));
        for(int i=2;i<x;i++)
        {
            ay = a2+a1;
            a1 = a2;
            a2 = ay;   
        }

        int flag = 0;
        string tmp,tmp1,tmp2,tmp3,tmp4;
        const char * sa = f2.c_str();

        for(int j=v-1;j>1;j--)
        {
            if(flag == 2 || flag == 0)
            {
                if(sa[len2] == 'b')
                {
                    flag = 1;
                    sa = f1.c_str();
                }
            }
            else
            {
                if(sa[len1] == 'a')
                {
                    flag = 2;
                    sa = f2.c_str();
                }
            }
        }

        if(flag == 2 || flag == 0)
        {
            tmp2 = f2.substr(len2-len+1,len2);
        }
        else
        {
            tmp2 = f1.substr(len1-len+1,len1);
        }

        sa = f2.c_str();
        flag = 0;

        for(int j=v-1;j>1;j--)
        {   
            if(sa[0] == 'a')
            {
                sa = f2.c_str();
                flag = 2;
            }
            else
            {
                sa = f1.c_str();
                flag = 1;
            }
        }

        if(flag == 2 || flag == 0)
        {
            tmp1 = f2.substr(0,len-1);
        }
        else
        {
            tmp1 = f1.substr(0,len-1);
        }
        tmp = tmp2 + tmp1;
        cc[3] = cmp(tmp,str); 

        sa = f1.c_str();

        for(int j=v;j>1;j--)
        {   
            if(sa[0] == 'a')
            {
                sa = f2.c_str();
                flag = 2;
            }
            else
            {
                sa = f1.c_str();
                flag = 1;
            }
        }

        if(flag == 1 || flag == 0)
        {
            tmp4 = f1.substr(0,len-1);
        }
        else
        {
            tmp4 = f2.substr(0,len-1);
        }

        tmp = tmp2 + tmp4;
        cc[2] = cmp(tmp,str);  //ab連接


        sa = f1.c_str();
        flag = 0;

        for(int j=v;j>1;j--)
        {
            if(flag == 1 || flag == 0)
            {
                if(sa[len1] == 'b')
                {
                    flag = 1;
                    sa = f1.c_str();
                }
            }
            else
            {
                if(sa[len2] == 'a')
                {
                    flag = 2;
                    sa = f2.c_str();
                }
            }
        }


        if(flag == 1 || flag == 0)
        {
            tmp3 = f1.substr(len1-len+1,len1);
        }
        else
        {
            tmp3 = f2.substr(len2-len+1,len2);           
        }
        tmp = tmp3 + tmp1;  //ba
        cc[1] = cmp(tmp,str);
        tmp = tmp3 + tmp4; //bb
        cc[0] = cmp(tmp,str);


        sa = a2.c_str();
        while(sa)
        {   
            if(*sa == 'a')
            {
                bignum(count,ct[1],256);
            }
            else
            {
                bignum(count,ct[0],256);
            }

            if(!sa[1])
            {
                memcpy(ct1,count,256);
                break;
            }
            if(sa[1] == 'a' && *sa == 'a')
            {
                bignum(count,cc[3],256);
            }
            if(sa[1] == 'a' && *sa == 'b')
            {
                bignum(count,cc[1],256);
            }
            if(sa[1] == 'b' && *sa == 'a')
            {
                bignum(count,cc[2],256);

            }
            if(sa[1] == 'b' && *sa == 'b')
            {
                bignum(count,cc[0],256);
            }
            sa++;
        }

    }


    int flag = 0;
    for(int i=0;i<256;i++)
    {
        int temp = count[i];
        if(temp != 0)
            flag = 1;
        if(flag == 1)
        {
            cout<<temp;
        }
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章