1. 程式人生 > >演算法的設計與應用研究

演算法的設計與應用研究



KMP:

【NOI2014】 動物園

# include <cstring>
# include <cstdio>
using namespace std;
typedef long long ll;
const int mod = 1e9+7;
const int maxl = 1000010;
char s[maxl];
int pre[maxl],dep[maxl];
void getFail(){
	int l = strlen(s);
	int j=0; dep[1]=1;
	for (int i=1;i<l;++i){
		while (j&&s[j]!=s[i]) j=pre[j];
		if (s[j]==s[i]) ++j;
		pre[i+1]=j;
		dep[i+1]=dep[j]+1;
	}
}
void getAns(){
	ll ans=1;
	int l = strlen(s);
	int j=0;
	for (int i=1;i<l;++i){
		while (j&&s[j]!=s[i]) j=pre[j];
		if (s[j]==s[i]) ++j;
		while (j>(i+1)/2 && j) j=pre[j];
		ans=(ans*(dep[j]+1))%mod;
	}
	printf("%lld\n",ans);
}
int main(){
	int T; scanf("%d",&T);
	while (T--){
		scanf("%s",s);
		getFail();
		getAns();
	}
	return 0;
}


線段樹:(採用神奇實現方法)

【Luogu#3372】區間加/區間和

# include <cstdio>
using namespace std;
typedef long long ll;
const int maxn = 100010;
int n,m;
int ra[maxn];
namespace Seg{
	ll sum[maxn<<2];
	int tag[maxn<<2],siz[maxn<<2];
	void pup(int x){ sum[x]=sum[x<<1]+sum[x<<1|1]; }
	void ptg(int x,int tg){ tag[x]+=tg; sum[x]+=siz[x]*tg; }
	void pdw(int x){ if (tag[x]) ptg(x<<1,tag[x]),ptg(x<<1|1,tag[x]),tag[x]=0; }
	void init(int x,int l,int r)
	{
		sum[x]=tag[x]=0; siz[x]=r-l+1;
		if (l==r){ sum[x]=ra[l]; return; }
		int m = (l+r)>>1;
		init(x<<1,l,m); init(x<<1|1,m+1,r);
		pup(x);
	}
	
	int opty,opl,opr,opg;
	ll opans;
	void step(int x,int l,int r)
	{
		if (opl <= l && r <= opr)
		{
			if (opty == 1) ptg(x,opg);
			if (opty == 2) opans += sum[x];
			return;
		}
		int m = (l+r)>>1; pdw(x);
		if (opl<=m) step(x<<1,l,m);
		if (opr>m)  step(x<<1|1,m+1,r);
		if (opty == 1) pup(x);
	}
}
void work(){
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;++i) scanf("%d",ra+i);
	Seg::init(1,1,n);
    for (int i=1;i<=m;++i)
	{
        scanf("%d%d%d",&Seg::opty,&Seg::opl,&Seg::opr);
        if(Seg::opty==1) scanf("%lld",&Seg::opg);
        Seg::opans=0; Seg::step(1,1,n);
        if(Seg::opty==2) printf("%lld\n",Seg::opans);
    }
}
int main(){
    work();
    return 0;
}

相關推薦

演算法設計應用研究

KMP: 【NOI2014】 動物園 # include <cstring> # include <cstdio> using namespace std; typedef

演算法設計應用》資料結構回顧-樹

概念回顧 昨晚看到資料結構中的樹部分,現在回顧一下。   樹是資料結構裡面比較複雜,也比較有趣的一種。 對應的名稱很多,比如二叉樹,紅黑樹,B樹,B+樹等等 對應排序也挺多,前序,中序等等。   排序回顧 最近看到《演算法設計與應用》書裡面提到書的排序方式印象較深。 分為

演算法設計應用基礎-第十一週

Best Time to Buy and Sell Stock           Say you have an array for which the ith element is the price of a given stock on dayi. If you

演算法設計分析 ——8-2 哈夫曼演算法的證明及應用

21個項和10個項的檔案歸併,比較一次拿走一個,最後剩下一個可以不用比較。 21這個檔案裡的每一個項,在它上邊要參與3次歸併,每次歸併,這裡面的項都要參與一次比較。也就是說,21這個結點裡面的每一個項都要比較它的深度數的次數。 -5

CAN設計應用指南

校驗 代碼 OS 面積 註意 content 德國 檢測方法 碰撞檢測 CAN設計與應用指南 0.前言 這是我為公司寫的一個關於CAN總線的入門文章,對全面理解CAN總線特性很有幫助,拿出來分享給大家。 1. 簡介 CAN總線由德國BOSCH公司開發,最高速率可達到

演算法設計分析——動態規劃(一)矩陣連乘

動態規劃——Dynamic programming,可以說是本人一直沒有啃下的骨頭,這次我就得好好來學學Dynamic programming. OK,出發! 動態規劃通常是分治演算法的一種特殊情況,它一般用於最優化問題,如果這些問題能夠: 1.能夠分解為規模更小的子問題 2.遞迴的

演算法設計分析——分治法

前言 本文重點回顧了卜老師課堂上關於分治演算法的一些常見的問題。加油吧!ヾ(◍°∇°◍)ノ゙ 分治法(Divide and Conquer) 當面對一個問題的時候,我們可能一下子找不到解決問題的方法。此時,我們可以考慮將問題規模最小化,先看看當問題規模變小以後,我們如何去解決

演算法設計分析04-排序問題

①氣泡排序:量量比較待排序資料元素的大小,發現兩個資料元素的次序相反時進行交換,直到沒有反序的資料元素為止。時間複雜度是O(n*2)。穩定的。下面給出兩種排序演算法,我比較喜歡第二種,因為第二種才能真正解釋冒泡的原理 public class bubble1 {    &n

演算法設計分析03-十進位制轉二進位制問題

10進位制數轉2 進位制數 題目:2 進位制除了 0,1,還可以用 2 表示。例如: 1-> 1 2-> 10 or 02 3->11 4 ->100 or 020 or 012 問題:這樣一個十進位制數轉為二進位制數,就不是唯一的了。現求十進位制數 N 轉換為這種二進位制數

演算法設計分析02-走臺階問題

走臺階問題,一次可以走1,2,3級,都 N級臺階的方法數 。 初始:f(0) = 0; f(1) =1; f(2) = 1 + 1 = 2; 遞推公式:f(n) = f(n - 1) + f(n-2) + f(n - 3) 解題思路: 因為一次可以走1,2,3級,所以在第

演算法設計分析01-連結串列的逆置

一.最常用的方法: LNode*  ReverseList(LNode* head) {     if (head == NULL)         return NULL;  &nbs

演算法設計分析05-最近點對演算法

1.題目描述: 設S是平面上n個點的集合,在這一節中,我們考慮在S中找到一個點對p和q的問題,使其相互距離最短。換句話說,希望在S中找到具有這樣性質的兩點p1 = (x1,y1)和p2 = (x2,y2),使它們間的距離在所有S中點對間為最小 2.解題思路 一共分為三種情況 情況1:

演算法設計計算(改寫二分搜尋演算法)(教材2-3)

二分搜尋 設a[0:n-1]是一個已排好序的陣列。請改寫二分搜尋演算法,使得當搜尋元素x不在陣列中時,返回小於x的最大元素的位置I和大於x的最大元素位置j public static int binarySearch(int []a,int x,int n) {int left=0; int r

HBase篇(1)-設計應用場景

【每日五分鐘搞定大資料】系列,HBase第一篇 講完了Zookeeper, 接下來我們來說下Google三駕馬車之一BigTable的開源實現:HBase,要講得內容如下: hbase的特點 千萬級高併發 PB級儲存 非結構化儲存 動態列,稀疏列 支援二級索引

演算法設計分析課程的時間空間複雜度

演算法設計與分析課程的時間空間複雜度: 總結 演算法 時間複雜度 空間複雜度 說明 Hanoi $ O(2^n) $ $ O(n) $ 遞迴使用 會場安排問題 \(O

【計算機演算法設計分析】——SVM

一.簡介 支援向量機(support vector machines)是一種二分類模型,它的目的是尋找一個超平面來對樣本進行分割,分割的原則是間隔最大化,最終轉化為一個凸二次規劃問題來求解。由簡至繁的模型包括: (1)當訓練樣本線性可分時,通過硬間隔最大化,學習一個線性可分支援向量機;(2)當訓練樣本近似

RS485設計應用指南

0. 前言 當前自動控制系統中常用的網路,如現場匯流排CAN、Profibus、INTERBUS-S以及ARCNet的物理層都是基於RS-485的匯流排進行總結和研究。 1、EIA RS-485標準 在自動化領域,隨著分散式控制系統的發展,迫切需要一種匯流排能適合遠距離的數字通訊

演算法設計分析作業題】第十一週:20. Valid Parentheses

題目 C++ solution class Solution { public: bool isValid(string s) { stack<char> cstack; for (int i = 0; i < s.si

演算法設計分析》第十一週作業

《演算法設計與分析》第十一週作業 標籤(空格分隔): 課堂作業 文章目錄 《演算法設計與分析》第十一週作業 @[toc] 題目概要 思路 具體實現 心得 原始碼:

演算法設計分析》第十二週作業

《演算法設計與分析》第十二週作業 標籤(空格分隔): 課堂作業 文章目錄 《演算法設計與分析》第十二週作業 @[toc] 題目概要 思路 具體實現 心得 原始碼: