用set**寫了一堆自己都看不懂的**, 一提交居然ac了, 一發入魂
#include
#define ff(a,b) for(int a=0;a#define f(a,b) for(int a=1;a<=b;a++)
#define len 510000
#define inf 1000000
#define bug(x) cout<<#x<<"="namespace std;
char buf[
100010];
intmain()
while
(n--
)else
else
if(tpos.
size()
==1)else
it--
;//復原
if(it!=tpos.
begin()
)}}printf
("%d\n"
,ans);}
}}return0;
}
其實dp也簡單.
對於錄入的資料, 從左到有做如下狀態轉移:
用pre[k] 記錄 字母k最近(最靠右)出現的下標. 未出現用0代替
對字串從左到右掃瞄, 當前下標為i , 字元為k, 做判斷 :
pre[k]
= i;
//僅僅做更新
j=pre[k]
//記錄上次位置
pre[k]
= i;
//做更新
f[i]
=i-j;
//因為i是最近(右)出現的, 必然距離左邊的那個字母最近
f[j]
=min
(f[j]
,f[i]
)//而左邊的, 需要狀態轉移
歐陽巨佬**:
// #include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
const
int inf =
0x3f3f3f3f
;//----------------
#define int long long
#define double long double
//----------------
#define file(s) freopen(s ".in", "r", stdin), freopen(s ".out", "w", stdout)
inline
intread()
while
(ch >=
'0'&& ch <=
'9')
return x * f;
}#define sdf(x) x=read()
#define for(i, a, b) for (int i = (a); i <= (b); i++)
#define ffor(i, a, b) for (int i = (a); i >= (b); i--)
#define me(a, b) memset(a, b, sizeof(a))
#define addmod(x, y) (x) = ((x)+ (y)) % mod
#define mulmod(x, y) (x) = (((x) % mod) * ((y) % mod)) % mod
#define chkmin(x, y) (x) = (x) <= (y) ? (x) : (y)
#define chkmax(x, y) (x) = (x) >= (y) ? (x) : (y)
#define mid ((l + ((r - l)/2)))
#define edge struct edgee[n << 1];int fi[n];int ce = 1;
#define star_link inline void add(int u, int v, int w);fi[u] = ce;}
#define qmul inline ll qmul(ll x,ll y)
#define go(u) for (int i = fi[u]; i; i = e[i].nx)
#define random(a, b) ((a) + rand() % ((b) - (a) + 1))
#define cnm cout<<"d"
#define bg1(x) cout<<(#x)<<":"<<(x)<<" "<#define bg2(x,y) cout<<(#x)<<":"<<(x)<<" "<<(#y)<<":"<<(y)<<" "<#define bg3(x,y,z) cout<<(#x)<<":"<<(x)<<" "<<(#y)<<":"<<(y)<<" "<<(#z)<<":"<<(z)<<" "<#define bg4(x,y,z,w) cout<<(#x)<<":"<<(x)<<" "<<(#y)<<":"<<(y)<<" "<<(#z)<<":"<<(z)<<" "<<(#w)<<":"<<(w)<<" "<#define bg5(x,y,z,w,k) cout<<(#x)<<":"<<(x)<<" "<<(#y)<<":"<<(y)<<" "<<(#z)<<":"<<(z)<<" "<<(#w)<<":"<<(w)<<" "<<(#k)<<":"<<(k)<<" "#define die die++;if(die>100000)
#define lson p << 1, l, mid
#define rson p << 1 | 1, mid + 1, r
#define root 1, 1, n
const
double eps =
1e-9
;// srand((unsigned)time(null));
ll mod =
1e9+7;
const
int n =
1e6+5;
int t;
char s[n]
, ss[n]
;int q;
char c;
int n;
int f[n]
;int pre[n]
;voidwk(
int i)
}void
wk2(
int i)
pre[k]
= i;
}signed
main()
while
(q--
)else}}
}
北郵OJ打牌
牌只有1到9,手裡拿著已經排好序的牌a,對方出牌b,用程式判斷手中牌是否能夠壓過對方出牌。規則 出牌牌型有5種 1 一張 如4 則5.9可壓過 2 兩張 如44 則55,66,77,99可壓過 3 三張 如444 規則如 2 4 四張 如4444 規則如 2 5 五張 牌型只有12345 23456...
北郵OJ虛數
乙個複數 x iy 集合,兩種操作作用在該集合上 1 pop 表示讀出集合中複數模值最大的那個複數,如集合為空 輸出 empty 不為空就輸出最大的那個複數並且從集合中刪除那個複數,再輸出集合的大小size 2 insert a ib 指令 a,b表示實部和虛部 將a ib加入到集合中 輸出集合的大...
北郵OJ樹查詢
有一棵樹,輸出某一深度的所有節點,有則輸出這些節點,無則輸出empty。該樹是完全二叉樹。輸入描述 輸入有多組資料。每組輸入乙個n 1 n 1000 然後將樹中的這n個節點依次輸入,再輸入乙個d代表深度。輸出描述 輸出該樹中第d層得所有節點,節點間用空格隔開,最後乙個節點後沒有空格。示例1輸入 41...