比较水的一题,正解觉得是状压,但是第一眼看去就觉得是hash,其实本题hash状压是一样的。
#include <cstdio>//hash
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
typedef long long LL;
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define N 1000005
#define INF 1000000007
const LL hashv = 1000000007;
int n, l;
char a[N];
LL hv[1005];
int t;
LL val;
int s;
int main(){
hv[0] = 0;
hv[1] = 1;
for(int i = 2; i <= 1000; i++){
hv[i] = hv[i - 1] * hashv;
}
while(scanf("%d%d", &n, &l) != EOF){
s = n;
scanf("%s", a);
for(int j = 0; j < l; j++){
t = min(13, n);
int flag = -1;
while(t > 0){
val = 0;
for(int i = n - 1; i >= n - t; i--){
val = val * hashv + a[i];
}
LL nv = val;
for(int i = n - t - 1; i >= 0; i--){
nv -= a[i + t] * hv[t];
nv = nv * hashv + a[i];
if(nv == val){
flag = i + t;
break;
}
}
if(flag != -1)break;
t--;
}
if(flag != -1){
a[n] = a[flag];
n ++;
}
else {
a[n] = '0';
n ++;
}
}
for(int i = s; i < n; i++){
printf("%c", a[i]);
}
printf("\n");
}
return 0;
}
#include <cstdio>//状压
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
typedef long long LL;
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define N 1100005
#define INF 1000000007
int n, l;
char a[N];
int t;
int s;
int x;
int main(){
while(scanf("%d%d", &n, &l) != EOF){
s = n;
scanf("%s", a);
for(int j = 0; j < l; j++){
t = min(13, n);
int flag = -1;
while(t > 0){
int v = 0;
for(int i = n - 1; i >= n - t; i--){
v <<= 1;
v |= (a[i] - '0');
}
int val = v;
x = 0;
for(int i = 0; i < t - 1; i++)
x |= (1 << i);
printf("%d %d %d\n", v, x, t);
for(int i = n - t - 1; i >= 0; i--){
val &= x;
val <<= 1;
val |= (a[i] - '0');
if(val == v){
flag = i + t;
break;
}
}
if(flag != -1)break;
t--;
}
if(flag == -1){
a[n] = '0';
n ++;
}
else {
a[n] = a[flag];
n ++;
}
}
for(int i = s; i < n; i++){
printf("%c", a[i]);
}
printf("\n");
}
return 0;
}