竞赛讨论区 > 我的代码用scanf输入wa了,改成cin就ac了 ?
头像
parallal
发布于 2020-07-26 22:41
+ 关注

我的代码用scanf输入wa了,改成cin就ac了 ?

cin的代码
#include <cstdio>
#include <iostream>
#include <istream>
#include <string.h>
#include <algorithm>
#include <string>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <math.h>
#include <vector>
using namespace std;
#define mod 1000000007
#define inf 0x3f
#define ll long long
//#define ls i<<1
//#define rs i<<1|1
#define pi 3.1415926
#define maxn 200005
ll dp[105][105];
int main()
{
    string s1,s2;
    ll n1,n2;
    while(cin>>s2>>n2>>s1>>n1)
    {
 
        int flag=0;
        ll l1=s1.size();
        ll l2=s2.size();
        if(n1==0||n2==0||l1==0||l2==0||n2*l2>n1*l1)
        {
            printf("0\n");
            continue;
        }
        for(ll i=0; i<l1; i++)//dp[i][0]是指从s1[i]开始需要几个字符才能找到s2
        {
            ll k=1;//k是字符总数
            for(ll j=0; j<l2; j++)
            {
                ll cnt=0;//cnt是找一个字符需要几个字符
                while(s1[(i-1+k+cnt)%l1]!=s2[j])
                {
                    cnt++;
                    if(cnt>l1){ printf("0\n"); flag=1; break;}//如果s1中没有s2[j] 答案为0
                }
                if(flag==1) break;
                cnt++;
                k+=cnt;
            }
            if(flag==1) break;
            dp[i][0]=k-1;
        }
        if(flag==1) continue;
        ll cnt=0;
        for(ll j=1; (1<<j)<=l1*n1; j++)
        {
            cnt=j;
            for(int i=0; i<l1; i++)
            {
                dp[i][j]=dp[i][j-1]+dp[(i+dp[i][j-1])%l1][j-1];//通过倍增求从s1[i]开始找(1<<j)个s2需要多少字符
            }
        }
        ll ans=0,tail=0,sum=0;
        for(ll i=cnt;i>=0;i--)//用二进制合成最多s2
        {
            if(ans+dp[tail][i]<=l1*n1)
            {
                ans+=dp[tail][i];//字符个数
                sum+=1<<i;//合成的s2个数
                tail=ans%l1;//当前字符尾端的位置
            }
        }
        printf("%lld\n",sum/n2);
    }
    return 0;
}
scanf的代码

#include <cstdio>
#include <iostream>
#include <istream>
#include <string.h>
#include <algorithm>
#include <string>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <math.h>
#include <vector>
using namespace std;
#define mod 1000000007
#define inf 0x3f
#define ll long long
//#define ls i<<1
//#define rs i<<1|1
#define pi 3.1415926
#define maxn 200005
ll dp[105][105];
int main()
{
    char s1[105],s2[105];
    ll n1,n2;
    while(scanf("%s%lld%s%lld",s2,&n2,s1,&n1)!=EOF)
    {
 
        int flag=0;
        ll l1=strlen(s1);
        ll l2=strlen(s2);
        if(n1==0||n2==0||l1==0||l2==0||n2*l2>n1*l1)
        {
            printf("0\n");
            continue;
        }
        for(ll i=0; i<l1; i++)//dp[i][0]是指从s1[i]开始需要几个字符才能找到s2
        {
            ll k=1;//k是字符总数
            for(ll j=0; j<l2; j++)
            {
                ll cnt=0;//cnt是找一个字符需要几个字符
                while(s1[(i-1+k+cnt)%l1]!=s2[j])
                {
                    cnt++;
                    if(cnt>l1){ printf("0\n"); flag=1; break;}//如果s1中没有s2[j] 答案为0
                }
                if(flag==1) break;
                cnt++;
                k+=cnt;
            }
            if(flag==1) break;
            dp[i][0]=k-1;
        }
        if(flag==1) continue;
        ll cnt=0;
        for(ll j=1; (1<<j)<=l1*n1; j++)
        {
            cnt=j;
            for(int i=0; i<l1; i++)
            {
                dp[i][j]=dp[i][j-1]+dp[(i+dp[i][j-1])%l1][j-1];//通过倍增求从s1[i]开始找(1<<j)个s2需要多少字符
            }
        }
        ll ans=0,tail=0,sum=0;
        for(ll i=cnt;i>=0;i--)//用二进制合成最多s2
        {
            if(ans+dp[tail][i]<=l1*n1)
            {
                ans+=dp[tail][i];//字符个数
                sum+=1<<i;//合成的s2个数
                tail=ans%l1;//当前字符尾端的位置
            }
        }
        printf("%lld\n",sum/n2);
    }
    return 0;
}


全部评论

(0) 回帖
加载中...
话题 回帖

本文相关内容

等你来战

查看全部

热门推荐