zoukankan      html  css  js  c++  java
  • CodeForces 615C

    题意:
    给定两个字符串s1,s2利用s1去构造s2,s1有无限个,可以翻转,你最少要用几个s1才能构造s2。输出每一次使用的s1的有效区间。
    伪思路:
    据说是暴力就能过的题目。然而自己就是暴力差,模拟差,DP差。。。。mdzz好像都差,不会怎么暴力。
    其他思路都想过一点,然后剩下两个比较可能的;
    ①:我暴力一发s2,以s2的字符为开始然后暴力过去,让s1去正的反的匹配,所以怎么记录?但是这样细节上处理太多了,比如这个刚好接上,或者不是刚好接上。这样的细节处理。
    ②:我暴力一发s2,每次取正反,然后一直暴力到终点,每次取正反暴力。如果正反都是没有结果直接可以标记掉,然后put:-1。
    但是这样的不好就是中间的情况的太多了,如果每次都有情况的话,那么就是2^很多次左右吧,但是这个len(s2)是有2100,这么暴力无非是作死。如果每次取最优呢?也就是每次我拿长的。。。这样真的可以么。。。直觉就是80%不行。就是觉得如果我这次正的比较长,然后可能会比较短,然后执行比较短的下次会比较长。然后好像举不出例子,所以要试一发。其实打起来也是很吃力啊。

    #include <bits/stdc++.h>
    //#include<iostream>
    //#include<cstdio>
    //#include<math.h>
    //#include<string.h>
    //#include<algorithm>
    using namespace std;
    typedef long long LL;
    typedef unsigned long long ULL;
    const double eps=1e-6;
    const double pi=acos(-1.0);
    const int mod=998244353;
    const int INF=0x3f3f3f3f;
    
    const int N=1200;
    
    char s1[N*2];
    char s2[N*2];
    int dp[N*2][3];
    
    int main()
    {
        int flag,n,m,k,j,h1,h2;
        int num;
        int len1,len2;
        scanf("%s%s",s1,s2);
        len1=strlen(s1);len2=strlen(s2);
        flag=k=0;
        num=0;
        int s,t;
        int x;
        for(int i=0;i<len2;){
            int nextpos=-1;
            int p1,p2;
            for(int j=0;j<len1;j++){
                int k=j;
                int next=i;
                while(k<len1&&s1[k]==s2[next])
                    k++,next++;
                if(next>nextpos){
                    nextpos=next;
                    p1=j+1;
                    p2=k;
                }
            }
            for(int j=len1-1;j>=0;j--){
                int k=j;
                int next=i;
                while(k>=0&&s1[k]==s2[next]){
                    next++;
                    k--;
                }
                if(next>nextpos){
                    nextpos=next;
                    p1=j+1;
                    p2=k+2;
                }
            }
            if(i==nextpos){
                puts("-1");
                return 0;
            }
            i=nextpos;
            dp[num][0]=p1;
            dp[num][1]=p2;
            num++;
        }
        printf("%d
    ",num);
        for(int i=0;i<num;i++)
        {
            printf("%d %d
    ",dp[i][0],dp[i][1]);
        }
        return 0;
    }
    
    
    
    
  • 相关阅读:
    折半插入排序-ACM题
    xcode 常用快捷键
    折半插入排序-算法
    插入排序
    HTML5 data-* 自定义属性
    vertical-align属性baseline(转)
    CSS 基础点
    解决-word里无论怎么改变字体颜色,字体总是红色的
    css属性前加*号的作用
    php 函数的嵌套
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934427.html
Copyright © 2011-2022 走看看