這題的難點在於相同的定義,在這樣的定義下一般的字串匹配演算法就不適用了。
但是可以通過乙個操作,將前後相鄰的字串差分形成乙個長度為len - 1的差分串,原來的相同下的定義就轉為了差分串的完全相同,證明顯然。
在這種情況下,再把字串全部拼接起來,用特殊字元隔開,然後二分他們的長度去做字尾陣列,看有沒有相鄰的乙個區間同時滿足長度最大並且包含所有k個字串。
#include #include#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define for(i, x, y) for(int i=x;i<=y;i++)
#define _for(i, x, y) for(int i=x;i>=y;i--)
#define mem(f, x) memset(f,x,sizeof(f))
#define sca(x) scanf("%d", &x)
#define sca2(x,y) scanf("%d%d",&x,&y)
#define sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define scl(x) scanf("%lld",&x);
#define pri(x) printf("%d\n", x)
#define prl(x) printf("%lld\n",x);
#define clr(u) for(int i=0;i<=n;i++)u[i].clear();
#define ll long long
#define ull unsigned long long
#define mp make_pair
#define pii pair#define pil pair#define pll pair#define pb push_back
#define fi first
#define se second typedef vector
vi;int read()
while (c >= '
0'&&c <= '
9')return x*f;}
const
double eps = 1e-9
;const
int maxn = 1e6 + 10
;const
int inf = 0x3f3f3f3f
;const
int mod = 1e9 + 7
; int
n,m,k;
intstr[maxn],id[maxn];
inta[maxn],height[maxn];
inttax[maxn],tp[maxn],sa[maxn],rak[maxn];
void
qsort()
void
sa()
}}void
get_height()
}int
stack[maxn];
bool
vis[maxn];
bool check(int
x)
if(!vis[id[sa[i - 1
]]])
if(!num) return
true
; }
else
}return
false;}
intsolve()
else
}return ans + 1;}
intmain()
str[++n] = ++m; id[n] =i;
}if(min <= 0
) sa(); get_height();
pri(solve());
return0;
}
二分 差分 思維
二分 差分 思維 當猜了乙個數 x 總共有三種情況 裁判說數大了,那麼裁判說對的取值範圍是 x 裁判說數小了,那麼裁判說對的取值範圍是 x,裁判說數一樣,那麼裁判說對的取值範圍是 x,x 那麼我們只需要求最大有多少個區間重疊了就行了,問題就轉化成了區間的修改,單點查詢,可以考慮差分了。注意題目資料 ...
金牌廚師(二分 差分)
乙個廚師可以做出辣度範圍是 1,n 的菜。現在有 m 個同學,每個同學可以接受的辣度範圍是 l i,r i 廚師每天會選擇一部分同學,做出讓他們都滿意的菜。滿意程度定義為選出的同學的人數 k 和能讓這部分同學都接受的菜的種類數 x 這裡理解為一種辣度對應一種菜 兩者中的最小值,即 min k,x 求...
2118 簽到題(二分 差分)
2118 簽到題 時間限制 1 sec 記憶體限制 128 mb 提交 54 解決 22 提交 狀態 討論版 命題人 admin 題目描述 作為acm集訓隊一員的你,有一天拿到了你的歷史訓練時長記錄表。你當然是想讓你的訓練時長看起來好看一些,所以你想調整這份記錄表,使得訓練時長最少的一天的時間在所有...