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 }
View Code

 

以上是关于codeforces615c的主要内容,如果未能解决你的问题,请参考以下文章

[Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)][C. Playing Piano](代码片段

c_cpp Codeforces片段

Codeforces 86C Genetic engineering(AC自动机+DP)

CodeForces 1005D Polycarp and Div 3(思维贪心dp)

(Incomplete) Codeforces 394 (Div 2 only)

CodeForces 931F Teodor is not a liar!