天天看点

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

cin的代码

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

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

{

ll k=1;//k是字符总数

for(ll j=0; 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<

{

cnt=j;

for(int i=0; i

{

dp[i][j]=dp[i][j-1]+dp[(i+dp[i][j-1])%l1][j-1];//通过倍增求从s1[i]开始找(1<

}

}

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<

tail=ans%l1;//当前字符尾端的位置

}

}

printf("%lld\n",sum/n2);

}

return 0;

} scanf的代码

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

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

{

ll k=1;//k是字符总数

for(ll j=0; 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<

{

cnt=j;

for(int i=0; i

{

dp[i][j]=dp[i][j-1]+dp[(i+dp[i][j-1])%l1][j-1];//通过倍增求从s1[i]开始找(1<

}

}

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<

tail=ans%l1;//当前字符尾端的位置

}

}

printf("%lld\n",sum/n2);

}

return 0;

}