SPOJ 665. String it out

来源:互联网 发布:营销软件网站源码 编辑:程序博客网 时间:2024/05/16 07:29

                   刚看到这个题时还以为是用动规求最长公共子列的方法做,其实只要一个for枚举判断循环的长度就可以了。想复杂了。。。。。。。。

#include<cstdio>#include<cstring>#include<iostream>#define MAXN 500010using namespace std;int main(){    //freopen("in.txt","r",stdin);    char a[MAXN],b[MAXN];    int cas,lena,lenb;    cin>>cas;    getchar();    while(cas--)    {        cin>>a>>b;        lena=strlen(a),lenb=strlen(b);        if(lena>lenb)        {            cout<<0<<endl;            continue;        }        else if(lena==lenb)        {            if(strcmp(a,b)==0)                cout<<1<<endl;            else cout<<0<<endl;            continue;        }        int flag=0,i;        for(i=lenb/lena; i>=0; i--)        {            int cur=0,num=0;            for(int j=0; b[j]!='\0'; j++)            {                if(b[j]==a[cur])                    num++;                if(num==i)                {                    cur++;                    num=0;                }                if(a[cur]=='\0')                {                    flag=1;                    break;                }            }            if(flag)  break;        }        if(flag)  cout<<i<<endl;        else cout<<0<<endl;    }    return 0;}


               下面这个用二分求解的,不是我的代码,放在这里对比学习。

#include<cstdio>#include<iostream>#include<cstring>#define MAXN 500020using namespace std;char a[MAXN],b[MAXN];int isok(int m){    int cur=0,num=0;    for(int i=0; b[i]!='\0'; i++)    {        if(b[i]==a[cur])            num++;        if(num==m)        {            cur++;            num=0;        }        if(a[cur]=='\0')            return 1;    }    return 0;}int main(){   // freopen("in.txt","r",stdin);    int cas,lena,lenb;    cin>>cas;    getchar();    while(cas--)    {        cin>>a>>b;        lena=strlen(a),lenb=strlen(b);        if(lena>lenb)        {            cout<<0<<endl;            continue;        }        else if(lena==lenb)        {            if(strcmp(a,b)==0)                cout<<1<<endl;            else cout<<0<<endl;            continue;        }        int x=0,y=lenb/lena;        while(x<y)        {            int m=(y-x)/2+x;            if(isok(m))            {                x=m+1;            }            else y=m;        }        if(isok(x))            cout<<x<<endl;        else if(x>0)   cout<<x-1<<endl;        else cout<<0<<endl;    }    return 0;}



原创粉丝点击