锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鎵浠ワ紝瀵逛簬浠繪剰鐨勪竴緇?i,j)錛宖(i,j) = min{f(i,j-1),f(i+2^(j-1),j-1)}鏉ヤ嬌鐢ㄥ姩鎬佽鍒掕綆楀嚭鏉ャ?br />榪欎釜綆楁硶鐨勯珮鏄庝箣澶勪笉鏄湪浜庤繖涓姩鎬佽鍒掔殑寤虹珛錛岃屾槸瀹冪殑鏌ヨ錛氬畠鐨勬煡璇㈡晥鐜囨槸O(1)錛佸鏋滀笉緇嗘兂鐨勮瘽錛屾庝箞寮勪篃鏄笉浼氭兂鍒版湁O錛?錛夌殑綆楁硶鐨勩傚亣璁炬垜浠姹傚尯闂碵m,n]涓璦鐨勬渶灝忓鹼紝鎵懼埌涓涓暟k浣垮緱2^k<n-m+1錛岃繖鏍鳳紝鍙互鎶婅繖涓尯闂村垎鎴愪袱涓儴鍒嗭細[m,m+2^k-1]鍜孾n-2^k+1,n]錛佹垜浠彂鐜幫紝榪欎袱涓尯闂存槸宸茬粡鍒濆鍖栧ソ鐨勶紒鍓嶉潰鐨勫尯闂存槸f(m,k)錛屽悗闈㈢殑鍖洪棿鏄痜(n-2^k+1,k)錛佽繖鏍鳳紝鍙鐪嬭繖涓や釜鍖洪棿鐨勬渶灝忓鹼紝灝卞彲浠ョ煡閬撴暣涓尯闂寸殑鏈灝忓鹼紒
涓嶅緱涓嶄僵鏈嶆兂鍑鴻繖涓畻娉曠殑浜哄晩錛?br />鍏蜂綋鐨勪唬鐮佸彲浠ョ湅poj 3264銆?br />涓嶈繃榪樻槸瑕佽鍑犱釜娉ㄦ剰鐨勫湴鏂癸細
寮杈熻繖涓簩緇存暟緇刦鐨勬椂鍊欐敞鎰忓叾絎簩緇翠笉瑕佸紑鐨勮繃澶э紝鍥犱負2鐨勬寚鏁頒細寰堝ぇ鐨勶紝鍒版椂鍊欏湪鑷繁鏈哄櫒涓婇兘鏃犳硶榪愯銆?br />鍦ㄥ姩鎬佽鍒掕綆楁暟緇刦鐨勬椂鍊欙紝鐢ㄥ2鍙栧鏁版潵璁$畻涓婇潰璇寸殑k錛岄偅鏍烽熷害濂戒竴鐐廣傝綆楀嚭k鍚庯紝娉ㄦ剰瀵瑰驚鐜帶鍒跺彉閲忕殑鑼冨洿鎺у埗錛岃屼笖涓鏃﹁秴鍑轟簡鑼冨洿錛岄偅涔堣鍊間究涓嶅繀璁$畻銆?br />綆楁寚鏁扮殑鏃跺欏彲浠ョ敤>>鍜?lt;<鏉ヨ綆楋紝涓嶈繃娉ㄦ剰鍔犳嫭鍙楓?br />鍦ㄦ煡璇㈢殑鏃跺欙紝k鍊間粛鐒跺彲浠ョ敤瀵?鍙栧鏁般?/font>
聽
渚嬬▼錛歱ku 3264
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
#define maxn 50001
int a[maxn];
int dpmax[maxn][40];
int dpmin[maxn][40];
int getmin(int a,int b)
{
聽聽聽 if(a<b) return聽 a;
聽聽聽 else聽聽聽 return聽 b;聽聽聽
}
int getmax(int a,int b)
{
聽聽聽 if(a>b) return聽 a;
聽聽聽 else聽聽聽 return聽 b;聽聽聽
}
void Make_Big_RMQ(int n)
{
聽聽聽 int i,j,k;
聽聽聽 for(i=1;i<=n;i++)聽 dpmax[i][0]=a[i];
聽聽聽 for(j=1;j<=log((double)n)/log(2.0);j++)
聽聽聽聽聽聽聽 for(i=1;i+(1<<j)-1<=n;i++)
聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽 dpmax[i][j]=getmax(dpmax[i][j-1],dpmax[i+(1<<(j-1))][j-1]);
聽聽聽聽聽聽聽 }聽聽聽
}
void Make_Min_RMQ(int n)
{
聽聽聽 int i,j,k;
聽聽聽 for(i=1;i<=n;i++)聽 dpmin[i][0]=a[i];
聽聽聽 for(j=1;j<=log((double)n)/log(2.0);j++)
聽聽聽聽聽聽聽 for(i=1;i+(1<<j)-1<=n;i++)
聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽 dpmin[i][j]=getmin(dpmin[i][j-1],dpmin[i+(1<<(j-1))][j-1]);
聽聽聽聽聽聽聽 }聽聽聽
}
int get_big_rmq(int a,int b)
{
聽聽聽 int k=(int)(log((double)(b-a+1))/log(2.0));
聽聽聽 return getmax(dpmax[a][k],dpmax[b-(1<<k)+1][k]);
}
int get_min_rmq(int a,int b)
{
聽聽聽 int k=(int)(log((double)(b-a+1))/log(2.0));
聽聽聽 return getmin(dpmin[a][k],dpmin[b-(1<<k)+1][k]);
}
int main()
{
聽聽聽 int n,m,i,j,k,q,x,y;
聽聽聽 while(scanf("%d%d",&n,&q)!=EOF)
聽聽聽 {
聽聽聽聽聽聽聽 for(i=1;i<=n;i++)
聽聽聽聽聽聽聽 scanf("%d",&a[i]);
聽聽聽聽聽聽聽 Make_Big_RMQ(n);
聽聽聽聽聽聽聽
聽聽聽聽聽聽聽 Make_Min_RMQ(n);
聽聽聽聽聽聽聽
聽聽聽聽聽聽聽 for(i=1;i<=q;i++)
聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽 scanf("%d%d",&x,&y);
聽聽聽聽聽聽聽聽聽聽聽 printf("%d\n",get_big_rmq(x,y)-get_min_rmq(x,y));聽聽聽
聽聽聽聽聽聽聽 }聽聽
聽聽聽聽聽聽聽
聽聽聽 }
聽聽聽
聽聽聽
聽聽聽 return 0;聽聽聽
}
|
瀛楀吀鏍?/span>(trie tree) |
|
|
鎴戠殑浠g爜錛?br>
#include<iostream>
using namespace std;
const int kind=26;
struct trienode
{
public:
trienode *next[kind];
int branch;
trienode()
{
branch=0;
for(int i=0;i<kind;i++)
next[i]=NULL;
}
};
class trie
{
trienode *root;
public:
trie()
{root=NULL;}
void insert(char s[])
{
trienode *location=root;
if(location==NULL)
location=root=new trienode();
int i=0,k;
while(s[i])
{
k=s[i]-'a';
if(location->next[k])
location->next[k]->branch++;
else
{
location->next[k]=new trienode();
location->next[k]->branch++;
}
i++;
location=location->next[k];
}
}
int search(char s[])
{
trienode *location=root;
if(!location) return 0;
int k,i=0,ans;
while(s[i])
{
k=s[i]-'a';
if(!location->next[k])
return 0;
ans=location->next[k]->branch;
location=location->next[k];
i++;
}
return ans;
}
};
int main()

{
char a[100];
int i;
trie mytrie;
while(gets(a))
{
if(a[0]=='\0')
break;
mytrie.insert(a);
}
while(gets(a)!=NULL)
{
//if(a=="end")
printf("%d\n",mytrie.search(a));
}
return 0;
}