枚举s, t, i, j 暴力检验
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
#define SF scanf
#define PF printf
using namespace std;
typedef long long LL;
const int MAXN = 40;
char s[MAXN+10], t[MAXN+10];
int m;
int pre[MAXN+10], nex[MAXN+10];
int P[MAXN+10], N[MAXN+10];
void init(int n) {
for(int i = 0; i < n; i++) {
pre[i] = i-1; nex[i] = i+1;
}
pre[0] = n-1; nex[n-1] = 0;
}
int make_string(int u, int blanck, int len) {
int x, y;
for(int i = 0; i < len; i++) {
t[i] = s[u];
x = pre[u]; y = nex[u];
nex[x] = y; pre[y] = x;
u = y;
for(int j = 0; j < blanck; j++) u = nex[u];
}
t[len] = 0;
return u;
}
bool OK(int u, int blanck, int len) {
int x, y;
for(int i = 0; i < len; i++) {
if(t[i] != s[u]) return false;
x = P[u]; y = N[u];
N[x] = y; P[y] = x;
u = y;
for(int j = 0; j < blanck; j++) u = N[u];
}
return true;
}
bool check(int n) {
char ret[MAXN+10]; memset(ret, 0, sizeof(ret));
for(int st = 0; st < m; st++) {
for(int i = 0; i < m; i++) {
init(m);
int cur = make_string(st, i, n);
if(!strcmp(ret, t)) continue ;
bool ok = false;
for(int j = i+1; j < m; j++) {
for(int pos = cur, length = 0; length < m - n; length++, pos = nex[pos]) {
memcpy(P, pre, sizeof(pre)); memcpy(N, nex, sizeof(nex));
if(OK(pos, j, n)) {
if(ret[0] != 0) {
puts("Codeword not unique");
return true;
}
else {
strcpy(ret, t);
ok = true;
break;
}
}
}
if(ok) break;
}
}
}
if(ret[0] != 0) {
cout << ret << '\n';
return true;
}
return false;
}
int main() {
int kase = 0;
while(~SF("%s", s)) {
if((m = strlen(s)) == 1 && s[0] == 'X') break;
PF("Code %d: ", ++kase);
for(int n = m >> 1; n >= 1; n--) {
if(check(n))
break;
}
}
}
字符串匹配算法
本文介绍了一种复杂的字符串匹配算法,通过枚举和动态调整字符位置来寻找特定长度的有效子串。该算法利用预处理和后处理指针进行字符串的构建与验证,确保找到的子串唯一且符合指定条件。
551

被折叠的 条评论
为什么被折叠?



