Codeforces Round #467 (Div. 2)-E-Lock Puzzle(思維題,構造)

  • 題目鏈接

  • 題意
    給定兩個長度爲n(1n2000) 的字符串s,t ,問是否能通過不超過6100 次的shift 操作使得s 變成tshift(x) 定義爲將字符串最後x 個字符反轉並移至字符串首。若可以,則輸出一種可能的方案的操作次數及操作序列。

  • 分析
    6100 這個數字有點奇怪,事出反常必有妖。再看n 的範圍,n(1n2000) ,可以構造一種操作,每次將一個s 的字符通過一系列的shift 操作移至最前面與t 匹配。
    參照這位大佬的博客,每次需要三步shift 操作。
    1. shift(n)
    2. 設當前與t 匹配的字符在s 中的下標是j ,則shift(j)
    3. shift(1)

  • 代碼

#include <bits/stdc++.h>
using namespace std;

const int maxn=2018;
int n;
char s[maxn],t[maxn];
vector <int >ans;

void shift(int x)
{
    if(x==0) return ;
    reverse(s,s+n);
    reverse(s+x,s+n);
    ans.push_back(x);
}

int main()
{
    scanf("%d%s%s",&n,s,t);
    for(int i=0;i<n;++i)
    {
        int j=i;
        while(j<n&&s[j]!=t[n-i-1]) ++j;
        if(j==n)
        {
            printf("-1\n");
            return 0;
        }
        shift(n);
        shift(j);
        shift(1);
    }
    printf("%d\n",ans.size());
    for(int i=0;i<ans.size();++i)
        printf("%d ",ans[i]);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章