HDU6628
一眼就看出一个巧妙的公式 能过所有样例以及自己造的样例 但就是会wa
#include<cstdio>
#include<cmath>
#include <cstring>
#define INF 1000000
#define MAXN 100000
using namespace std;
int fac[30] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320};
int a[30], vis[30], bhmd[30];
int main()
{
for(int i = 9; i <= 20; i++) fac[i] = INF;
int T, N, K;
scanf("%d", &T);
while(T--){
memset(vis, 0, sizeof(vis));
memset(bhmd, 0, sizeof(bhmd));
scanf("%d%d", &N, &K);
K--;
a[0] = N;
while(K >= fac[N-1]){
K -= fac[N-1];
a[0]--;
}
vis[a[0]] = 1;
for(int i = 1; i <= N-2; i++){
bhmd[i] = K / fac[N - i - 1];
K %= fac[N - i - 1];
}
for(int t = 1; t < N; t++){
int i = 1;
while(vis[i] || bhmd[t] > 0){if(!vis[i]) bhmd[t]--; i++; }
vis[i] = 1;
a[t] = i;
}
for(int i = 0; i < N; i++){
if(i)printf(" ");
printf("%d", a[i]);
}
printf("\n");
}
return 0;
}
虽然这种公式能过样例,但是很不科学,完全是根据样例凑的。这种做法不可取
其实K数据范围那么小,暴搜就完事
#include<bits/stdc++.h>
using namespace std;
int rem[30], d[30];
int T, N, K;
bool dfs(int id, int low, int hi){
if(id == N){
K--;
if(!K){
for(int i = 0; i < N; i++) {
if(i) printf(" ");
printf("%d", d[i] - low + 1);
}
printf("\n");
return 1;
}
return 0;
}
for(int i = hi - N + 1; i <= low + N - 1; i++){//i是枚举的差,每个数要比low+N-1小,比hi-N+1大
if(rem[i]) continue;
rem[i] = 1;
d[id] = i;
if(dfs(id + 1, min(i, low), max(i, hi))){
rem[i] = 0;
return 1;
}
rem[i] = 0;
}
return 0;
}
int main(){
scanf("%d", &T);
while(T--){
scanf("%d%d", &N, &K);
rem[N] = 1;
d[0] = N;
dfs(1, N, N);
rem[N] = 0;
}
}
HDU6629
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXN 1000005
char s[MAXN];
int nxt[MAXN];
long long tot[MAXN];
int main(){
int T;
scanf("%d", &T);
while(T-- > 0) {
scanf("%s", s);
int i = 0, j = -1, len = strlen(s);
nxt[0] = -1;
while (i <= len) {
if (j == -1 || s[i] == s[j]) nxt[++i] = ++j;
else j = nxt[j];
}
memset(tot, 0, sizeof tot);
long long ans = 0;
for (int i = 1; i <= len - 1; i++) {//队友的玄学优化
long long tmp = 0;
int pre = 0;
while (nxt[i] > -1) {
tmp++;
pre = nxt[i];
nxt[i] = nxt[nxt[i]];
}
tot[i] = tmp + tot[pre];
ans += tot[i];
}
printf("%lld\n", ans);
}
return 0;
}