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

猜你喜欢

转载自www.cnblogs.com/pandaking/p/9986551.html
今日推荐