生活随笔
收集整理的這篇文章主要介紹了
CodeForces 615C
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題意:
給定兩個字符串s1,s2利用s1去構(gòu)造s2,s1有無限個,可以翻轉(zhuǎn),你最少要用幾個s1才能構(gòu)造s2。輸出每一次使用的s1的有效區(qū)間。
偽思路:
據(jù)說是暴力就能過的題目。然而自己就是暴力差,模擬差,DP差。。。。mdzz好像都差,不會怎么暴力。
其他思路都想過一點,然后剩下兩個比較可能的;
①:我暴力一發(fā)s2,以s2的字符為開始然后暴力過去,讓s1去正的反的匹配,所以怎么記錄?但是這樣細節(jié)上處理太多了,比如這個剛好接上,或者不是剛好接上。這樣的細節(jié)處理。
②:我暴力一發(fā)s2,每次取正反,然后一直暴力到終點,每次取正反暴力。如果正反都是沒有結(jié)果直接可以標(biāo)記掉,然后put:-1。
但是這樣的不好就是中間的情況的太多了,如果每次都有情況的話,那么就是2^很多次左右吧,但是這個len(s2)是有2100,這么暴力無非是作死。如果每次取最優(yōu)呢?也就是每次我拿長的。。。這樣真的可以么。。。直覺就是80%不行。就是覺得如果我這次正的比較長,然后可能會比較短,然后執(zhí)行比較短的下次會比較長。然后好像舉不出例子,所以要試一發(fā)。其實打起來也是很吃力啊。
#include <bits/stdc++.h>
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\n",num);
for(
int i=
0;i<num;i++){
printf(
"%d %d\n",dp[i][
0],dp[i][
1]);}
return 0;
}
轉(zhuǎn)載于:https://www.cnblogs.com/keyboarder-zsq/p/5934427.html
總結(jié)
以上是生活随笔為你收集整理的CodeForces 615C的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。