1.已经匹配了i个后再加一个字符j变成匹配e[i][j]个
memset(e, 0, sizeof(e));
for(int i = 1; i <= len; i++) {
int fail = e[i-1][s[i]-'A'];
e[i-1][s[i]-'A'] = i;
memcpy(e[i], e[fail], sizeof(e[i]));
}
2.二进制压位背包
//p[x]=-1表明不能组成x,否则能组成
for(i = 0; i <= tot; i++) {
p[i] = -1;
f[i] = 0;
}
p[0] = 0;
f[0] |= 1<<0;
int nn = (tot>>5) + 1;
for(i = 1; i < n; i++) {
int w = a[i].v;
int d = w>>5;
int m = w&31;
for(j = 0; j < nn; j++) tf[j] = 0;
for(j = d; j < nn; j++) {
tf[j] |= f[j-d]<<m;
if(j+1 < nn && m != 0) tf[j+1] |= f[j-d]>>(32-m);
}
for(j = 0; j < nn; j++) if((f[j]|tf[j]) != f[j]) {
for(k = 0; k < 32; k++) if(!(f[j]&(1<<k)) && (tf[j]&(1<<k))) {
p[(j<<5)+k] = i;
}
f[j] |= tf[j];
}
}
3.动态访问对象函数
class A
{
};
typedef void (A::*PF)();
class B: public A
{
private:
int data;
public:
B(int data):data(data)
{
}
void fun()
{
cout<<"Hi, "<<data<<endl;
}
};
int main()
{
PF pf = (PF)(&B::fun);
B b(3);
A *pb = &b;
(pb->*pf)();
return 0;
}