1. 程式人生 > >【NOIP模擬題】【模擬】【DP】【JOI】2016.11.14第一題 複製&貼上2 題解

【NOIP模擬題】【模擬】【DP】【JOI】2016.11.14第一題 複製&貼上2 題解

複製&貼上2(A.c/cpp/pas/in/out)
(Time Limit:1s Memory Limit:256MB)
【Description】
文字編輯器的一個最重要的機能就是複製&貼上。JOI社現在正在開發一款能夠非常高速地進行復制&貼上的文字編輯器,作為JOI社一名優秀的程式猿,你擔負起了複製&貼上功能的測試這一核心工作。整個JOI社的命運都系在你的身上,因此你無論如何都想寫出一個正確且高速的程式來完成這項工作。
具體的做法如下所示。檔案的內容是一個字串S,對其進行N次複製&貼上的操作,第i次操作複製位置Ai和位置Bi之間的所有文字,然後在位置Ci貼上。這裡位置x表示字串的第x個字元的後面那個位置(位置0表示字串的開頭),例如字串”copypaste”的位置6表示字元’a’和字元’s’之間的位置,位置9表示’e’後面的位置(即字串的結尾)。不過,如果操作後的字串長度超過了M,那麼將超過的部分刪除,只保留長度為M的字首。
你的任務是寫一個程式,輸出N次操作後字串的前K個字元。
【Input】
第一行兩個空格分隔的正整數K和M,表示最終輸出的文字數量和字串長度的上限。
第二行一個字串S,表示初始的字串。
第三行一個整數N,表示操作的次數。
接下來N行,第i行包含三個空格分隔的整數Ai,Bi,Ci,表示第i次操作將位置Ai到Bi之間的字串複製,然後貼上到位置Ci。
【Output】
輸出一行一個長度為K的字串,表示最終的字串的長度為K的字首
【Sample Input】
2 18
copypaste
4
3 6 8
1 5 2
4 12 1
17 18 0
【Sample Output】
ac
【HINT】
初始的字串為”copypaste”。
第一次操作將從位置3到位置6的字串”ypa”複製,插入位置8,得到字串”copypastypae”
第二次操作將從位置1到位置5的字串”opyp”複製,插入位置2,得到字串”coopyppypastypae”
第三次操作將從位置4到位置12的字串”yppypast”複製,插入位置1,得到字串”cyppypastoopyppypastypae”,由於長度超過了M=18,刪除超過的部分,得到”cyppypastoopyppypa”
第四次操作將從位置17到位置18的字串”a”複製,插入位置0,得到字串”acyppypastoopyppypa”,刪除超過18的部分得到”acyppypastoopyppyp”
最後輸出長度為2的字首”ac”即為答案。
【Data Constraint】
對於40%的資料,N,M<=2000
對於100%的資料:
1<=K<=200
1<=M<=10^9
S的每個字元都是小寫字母(‘a’~’z’)
K<=|S|<=min(M,2*10^5)
1<=N<=2*10^5
設第i次操作前的字串長度為Li,那麼0<=Ai

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<string>
#include<iomanip>
#include<ctime>
#include<climits>
#include<cctype> #include<algorithm> #define LL long long #ifdef WIN32 #define AUTO "%I64d" #else #define AUTO "%lld" #endif using namespace std; const int maxm = 1e9+5; int k,n,len,m; char a[maxm],b[maxm]; template <class T> inline void read(T &xx) { xx = 0; T flag = 1
; char ch = (char)getchar(); while(ch<'0' || ch>'9') { if(ch == '-') flag = -1; ch = (char)getchar(); } while(ch>='0' && ch<='9') { xx = (xx<<1) + (xx<<3) + ch - '0'; ch = (char)getchar(); } xx *= flag; } void init() { read(k); read(m); scanf("%s",a); len = strlen(a)-1; read(n); } void cpy(int x, int y, int z) { len = strlen(a)-1; for(int i = 0; i < y-x; i++) b[i] = a[x+i]; if(len+y-x > m) len = m; else len = len+y-x; for(int i = len; i-y+x >= z; i--) a[i] = a[i-y+x]; for(int i = z; i < z+y-x; i++) a[i] = b[i-z]; } void prt() { for(int i = 0; i < k; i++) printf("%c",a[i]); } int main() { freopen("A.in","r",stdin); freopen("A.out","w",stdout); init(); while(n--) { int A,B,C; read(A); if(A > m) A = m; read(B); if(B > m) B = m; read(C); if(C > m) C = m; cpy(A, B, C); } prt(); return 0; }

②DP,即AC程式碼

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<string>
#include<iomanip>
#include<ctime>
#include<climits>
#include<cctype>
#include<algorithm>
#define LL long long
#ifdef WIN32
#define AUTO "%I64d"
#else
#define AUTO "%lld"
#endif

using namespace std; 

const int  maxm = 200200;
int n,m,k;
char s[maxm];
int a[maxm],b[maxm],c[maxm],ans[220];

template <class T> inline void read(T &xx)
{
    xx = 0;
    T flag = 1;
    char ch = (char)getchar();
    while(ch<'0' || ch>'9')
    {
        if(ch == '-') flag = -1;
        ch = (char)getchar();
    }
    while(ch>='0' && ch<='9')
    {
        xx = (xx<<1) + (xx<<3) + ch - '0';
        ch = (char)getchar();
    }
    xx *= flag;
}

void init()
{
    read(k); read(m);
    scanf("%s",s+1);
    read(n);
    for(int i = 1; i <= n; i++)
        read(a[i]), read(b[i]), read(c[i]);
    for(int i = 1; i <= k; i++) ans[i] = i;
}

void work()
{
    for(int i = n; i > 0; i--)
        for(int j = 1; j <= k; j++)
        {
            if(ans[j] <= c[i]) continue;
            if(ans[j] <= c[i]+b[i]-a[i]) ans[j] = ans[j] - c[i] + a[i];
            else ans[j] -= b[i] - a[i];
        }
    for(int i = 1; i <= k; i++) printf("%c",s[ans[i]]);
}

int main()
{
    freopen("A.in","r",stdin);
    freopen("A.out","w",stdout);
    init(); 
    work();
    return 0;
}

相關推薦

NOIP模擬模擬DPJOI2016.11.14第一 複製&貼上2 題解

複製&貼上2(A.c/cpp/pas/in/out) (Time Limit:1s Memory Limit:256MB) 【Description】 文字編輯器的一個最重要的機能就是複製&貼上。JOI社現在正在開發一款能夠非常高速地進行復

NOIP模擬圖論2016.11.18 第二題解

第二題:心(heart.cpp/c/pas) 背景描述: 不是一切深淵都是滅亡 不是一切滅亡都覆蓋在弱者的頭上 ——《這也是一切》 舒婷 有N個透明的盒子, 每個盒子裡面有兩個不同顏色的球,

NOIP模擬收銀員(一道好的查分約束

bsp max int printf out 以及 void def 判斷 /* s[]表示最優方案的序列中的前綴和,那麽s[23]就是最優方案 由題意我們可以列出這樣一些式子: s[i]+s[23]-s[16+i]>

NOIP 模擬[T1]return(模擬

【題解】【模擬】 【將序列讀入、排序、去重,列舉查詢原序列dream中的每一元素在已處理好的序列tm中的位置,並判斷tm中的前一個元素加當前元素mod大質數後是否等於tm中的後一個元素(tm是一個

NOIP模擬密碼鎖

提示 都是 sin urn 輸入 題目 fin i++ 元素 題目描述 hzwer有一把密碼鎖,由N個開關組成。一開始的時候,所有開關都是關上的。當且僅當開關x1,x2,x3,…xk為開,其他開關為關時,密碼鎖才會打開。 他可以進行M種的操作,每種操作

2017.07.10NOIP提高組模擬賽B組

font mic 集合點 之間 現在 problem 決定 family 打破 Summary   今天題目總體不是難,但是分數很低,只有100+10+30,其中第二題還是以前做過的,第一題設計數論,而且以前做過同一個類型的題目,比賽推了很長時間。第三題時以前做過的原題,

2017.07.11NOIP提高組模擬賽B組

span 結果 數組 運算 重要 eight 一點 對數 理解 Summary   今天的比賽打得還不錯,第一題被同桌灌輸的貪心,純模擬洗腦了,然後steal的看了一下,發現怎麽也對不了,一直在檢查。最後10分鐘才找出反例,推出動態規劃方程,沒有想到怎麽轉移,比賽就結束了

2017.07.14NOIP提高組模擬賽B組

noi net 處理 contest 比賽 size 很大的 pan 每天 Summary   這次比賽因為遲到了,少了很多時間,也受到了相應的懲罰,這是好的,是個標記牌,警醒著我。這次比賽的題目很難,也就是說,大家的得分都很低,總的來說,收獲還是很大的,因為有非常多的技

NOIP模擬藏寶圖 最小生成樹

names pri double span -- string noip getchar n! 性質:我們把最小生成樹建出來,如果其距離符合那麽就是對的,不符合就是錯的 因為這是個n^2的圖所以不能Kruskal只能Prim #include <cstdio>

2017.08.05NOIP提高組模擬賽B組

第一題 mar pan soft 提高 題目 mil font cal Summary   這次比賽打得非常差,第一題我以為是個難題,於是推了一下就沒再去想了,然而考場上一堆人AC。第二題狀態設錯了,導致結果有後效性。結束後pascal卡常卡了36次。第三題別人n&sup

NOIP 模擬模擬+鏈表

color blog 不常用 get 循環鏈表 fig problem bsp 常用 biubiu~~ 這道題實際上就是優化模擬,就是找到最先死的讓他死掉,運用時間上的加速,題解上說,要用堆優化,也就是這個意思。 對於鏈表,單項鏈表和循環鏈表都不常用,最常用的是雙向鏈表

NOIP 模擬中值濾波 打表找規律

超出 數學 printf clas col else 中值濾波 include noi 對於這樣看起來不像什麽算法也沒什麽知識點的題,一臉懵逼的話不是手推規律就是打表找規律......... 當然還有一些超出你能力之外的數學題...... #include <

noip模擬連環

!= ++ emc def lib 長度 似的 sof 答案 【題目描述】 惠子說:“連環可解也”。 這說明他是一個破解機關的高手,連連環都能解開,魯班鎖什麽的自然不在話下。一位魯班的後人非常不服氣,於是找到惠子,給他出了一道題。 他首先給了惠子

noip模擬德充符

amp 時間限制 一行 我們 但是 i++ 如果 time shuffle 時間限制:2s 內存限制:512MB 【題目描述】 申徒嘉和鄭子產都是伯昏無人的學生,子產因為申徒嘉是殘疾人,非常看不起他,於是想要刁難他。 子產給了申徒嘉 n個數 a1,a2...an。 現在他

NOIP模擬

== pen pan 復雜度 max mes algo 輸出 sin 【問題描述】 萌蛋有??顆珠子,每一顆珠子都寫有一個數字。萌蛋把它們用線串成了環。我們稱一個數字串是有趣的,當且僅當它的第 1 位是 2,且除了第 1 位以外的每一位都是 3。例如,2,233,233

NOIp模擬Walk

using 出發 col input note out 無法 lar lin Input file: walk.inOutput file: walk.outTime limit: 1 secondsMemory limit: 128 megabytes在比特鎮一共有 n

NOIp模擬Tourist Attractions

|| color turn stdout sin int div 表示 getchar() Input file: tour.inOutput file: tour.outTime limit: 1 secondsMemory limit: 128 megabytes在美麗

NOIp模擬String Master

sin for style clu amp ans idt int span Input file: master.inOutput file: master.outTime limit: 1 secondsMemory limit: 128 megabytes 所謂最長公

NOIP模擬賽(六)花園的守護之神(greendam)-最短路-最大流最小割

greate make rand pair bsp min com solution bool Problem Greemdam 題目大意 給一個圖$G=(V,E)$,求要使這個圖的最短路增長所需要增加的最小權值的值。 Solution 既然是要求這個玩意兒,我們可

noip模擬Fantasia

show line sum 後繼 模擬 什麽 問題 %d ide Time Litmit: 1000ms Memory Limit: 256MB Description 給定一張 $N$ 個點、$M$ 條邊的無向圖 $G$ 。每個點有個權值$W_i$。 我們