codeforces615c
Posted pandaking
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces615c相关的知识,希望对你有一定的参考价值。
题意:给定两个字符串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 ");return 0;} 29 ++cnt; 30 ans[cnt][0]=ll;ans[cnt][1]=rr; 31 i+=len; 32 } 33 printf("%d ",cnt); 34 for(int i=1;i<=cnt;i++) printf("%d %d ",ans[i][0],ans[i][1]); 35 return 0; 36 }
以上是关于codeforces615c的主要内容,如果未能解决你的问题,请参考以下文章
[Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)][C. Playing Piano](代码片段
Codeforces 86C Genetic engineering(AC自动机+DP)
CodeForces 1005D Polycarp and Div 3(思维贪心dp)