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) 回帖