http://www.elijahqi.win/archives/1381
自己写的渣渣代码 只有20分 留作纪念吧
#include<cstdio>
#include<cstring>
#define N 110
#define M 110000
#define inf 0x3f3f3f3f
struct node{
int st,ed;
}data[N];
char b[M<<1],a[N];
int cnt,ans,na,nb,f[M<<1][N];
inline void solve(int now){
int last=inf;
int len=data[now].ed-data[now].st+1;
for (int i=nb*2-len+1;i;--i){
int st=data[now].st;bool flag=1;
for (int j=0;j<len;++j)
if (b[i+j]!=a[st++]){flag=0;break;}
if (flag) last=i;f[i][now]=last;
}
}
int main(){
freopen("journey.in","r",stdin);
scanf("%s%s",a+1,b+1);
na=strlen(a+1),nb=strlen(b+1);memset(f,0x3f,sizeof(f));
for (int i=1;i<=nb;++i) b[i+nb]=b[i];
for (int i=1,last=1;i<=na;i=last){
while (a[i]=='*'&&i<=na) ++i;last=i;if (i==na+1) break;
data[++cnt].st=last;
while (a[i]!='*'&&i<=na) ++i;last=i;data[cnt].ed=i-1;solve(cnt);
}
for (int i=1;i<=nb*2;++i){
for (int j=1;j<=cnt;++j){
printf("%d ",f[i][j]);
}printf("asdfasdf\n");
}
for (int i=1;i<=nb;++i){
int now=1;int ed=i;
for (int j=1,last=1;j<=na;j=last){
while(a[j]=='*'&&j<=na) ++j;if (j>na) break;ed=f[ed][now];
last=data[now++].ed+1;ed+=data[now-1].ed-data[now-1].st+1;
}
if (ed-i<=nb) ans++;
}
printf("%d",ans);
//for (int i=1;i<=cnt;++i) printf("%d %d\n",data[i].st,data[i].ed);
return 0;
}
思路就是暴力模拟 我认为此题至少省选难度吧可能我太弱了 要想的细节实在太多 想不清
#include<cstdio>
#include<cstring>
#define N 110
#define M 110000
#define inf 0x3f3f3f3f
struct node{
int st,ed;
}data[N];
char b[M<<1],a[N];
int cnt,ans,na,nb,f[M<<1][N];
inline void solve(int now){
int last=inf;
int len=data[now].ed-data[now].st+1;
for (int i=nb*2-len;i>=1;--i){
int st=data[now].st;bool flag=1;
for (int j=0;j<len;++j)
if (b[i+j]!=a[st++]){flag=0;break;}
if (flag) last=i;f[i][now]=last;
}
}
inline bool judge(int st){
int pos=st,ed=st+nb-1;
if (a[1]!='*') {
if (f[st][1]!=st) return 0;else pos=st+data[1].ed-data[1].st+1;
}else pos=f[st][1]+data[1].ed-data[1].st+1;
if (pos>=inf) return 0;
for (int i=2;i<cnt;++i){
pos=f[pos][i]+data[i].ed-data[i].st+1;if (pos-1>ed) return 0;
}
if (a[na]!='*'){
if (f[ed-data[cnt].ed+data[cnt].st][cnt]!=ed-data[cnt].ed+data[cnt].st) return 0;
if (pos<=ed-data[cnt].ed+data[cnt].st) return 1;return 0;
}if (f[pos][cnt]+data[cnt].ed-data[cnt].st<=ed) return 1;return 0;
}
int main(){
//freopen("journey.in","r",stdin);
scanf("%s%s",a+1,b+1);
na=strlen(a+1),nb=strlen(b+1);memset(f,0x3f,sizeof(f));
for (int i=1;i<=nb;++i) b[i+nb]=b[i];
for (int i=1,last=1;i<=na;i=last){
while (a[i]=='*'&&i<=na) ++i;last=i;if (i==na+1) break;
data[++cnt].st=last;
while (a[i]!='*'&&i<=na) ++i;last=i;data[cnt].ed=i-1;solve(cnt);
}
/*for (int i=1;i<=nb*2;++i){
for (int j=1;j<=cnt;++j){
printf("%d ",f[i][j]);
}printf("asdfasdf\n");
}*/
for (int i=1;i<=nb;++i) if (judge(i)) ans++;
printf("%d",ans);
//for (int i=1;i<=cnt;++i) printf("%d %d\n",data[i].st,data[i].ed);
return 0;
}