标签:col scanf style codeforce 无限 force code 利用 print
题意:给定两个字符串s1,s2利用s1去构造s2,s1有无限个,可以翻转,你最少要用几个s1才能构造s2。输出每一次使用的s1的有效区间。
这道题我一直开始想从dp入手,但是发现我状态设置的原因,可能会出现n^3的算法,但是如果用贪心加模拟的话,可以在n^2内过掉,以下是参考cf上一个人后写出的代码:
代码如下:
1 #include<bits/stdc++.h> 2 using namespace std; 3 char s1[2200],s2[2200]; 4 int ans[2200][2]; 5 int main(){ 6 scanf("%s",s1+1); 7 scanf("%s",s2+1); 8 int len1=strlen(s1+1),len2=strlen(s2+1); 9 int i=1,len,cnt=0,ll,rr; 10 while(i<=len2){ 11 len=0; 12 for(int j=1;j<=len1;j++){ 13 if(s1[j]==s2[i]){ 14 int k=j-1; 15 while(k>=1&&i+j-k<=len2&&s1[k]==s2[i+j-k]) k--; 16 if(j-k>len){ 17 len=j-k; 18 ll=j;rr=k+1; 19 } 20 k=j+1; 21 while(k<=len1&&i+k-j<=len2&&s1[k]==s2[i+k-j]) k++; 22 if(k-j>len){ 23 len=k-j; 24 ll=j;rr=k-1; 25 } 26 } 27 } 28 if(len==0){printf("-1\n");return 0;} 29 ++cnt; 30 ans[cnt][0]=ll;ans[cnt][1]=rr; 31 i+=len; 32 } 33 printf("%d\n",cnt); 34 for(int i=1;i<=cnt;i++) printf("%d %d\n",ans[i][0],ans[i][1]); 35 return 0; 36 }
标签:col scanf style codeforce 无限 force code 利用 print
原文地址:https://www.cnblogs.com/pandaking/p/9986551.html