记录编号 363944 评测结果 ATTAAAAAAAA
题目名称 [BZOJ 4503] 你猜是不是KMP 最终得分 81
用户昵称 GravatarYGOI_真神名曰驴蛋蛋 是否通过 未通过
代码语言 C++ 运行时间 2.608 s
提交时间 2017-01-14 14:31:34 内存使用 0.97 MiB
显示代码纯文本
#include <cstdio>
#include <bitset>
//#include <iostream>
#include <cstring>
const int MAXN=1E5+10;
std::bitset<MAXN> pos[26];
std::bitset<MAXN> ans;
int last[MAXN],sum;
char s[MAXN],t[MAXN];
int main() {
	freopen("guess.in","r",stdin);
	freopen("guess.out","w",stdout);
	scanf("%s%s",s,t);
	int len1=strlen(s);
	int len2=strlen(t);
	for(int i=0;i<len1;++i) {
		ans[i]=pos[s[i]-'a'][i]=1;
	}for(int i=0;i<len2;++i) {
		//std::cout<<i<<" "<<t[i]<<" "<<ans<<std::endl;
		if(t[i]=='?')continue;
		int now=t[i]-'a';
		pos[now]>>=i-last[now];
		//std::cout<<"    "<<pos[now]<<std::endl; 
		last[now]=i;
		ans&=pos[now];
	}//std::cout<<ans<<std::endl;
	for(int i=0;i<len1-len2+1;++i) {
		sum+=ans[i];
	}
	printf("%d\n",sum);
	for(int i=0;i<len1-len2+1;++i) {
		if(ans[i])printf("%d\n",i);
	}fclose(stdin);fclose(stdout);
	return 0;
}