题目大意:啥都不说了,就是一个模式匹配
解决:KMP 刚开始一直wa,后来经同学提醒突然想到了溢出了,改了之后,一次就过了
#include <iostream> #include <cstdio> #include <cstring> using namespace std; char s[1000005],t[10005]; int next[10005],tlen,slen; void getnext() { int i=1,j=0; next[1]=0; while(i<=tlen) {//本来的模式匹配 i < tlen 就结束了,但是为了让模式串结束的时候继续比较,将最需要再添加一个,i=len的时候匹配的地方 if(j==0 || t[i]==t[j]) { i++;j++; if(t[i]!=t[j]) next[i]=j; else next[i]=next[j]; } else j=next[j]; } } int kmp() { int i=1,j=1,cnt=0; while(i<=slen) { if(j==0 || s[i]==t[j]) { i++;j++; //当模式 串匹配成功的时候,j仍然可以退回到next[j]的位置,继续与主串比较 if(j==tlen+1){ cnt++; j=next[j]; } } else j=next[j]; } return cnt; } int main() { int icase; scanf("%d",&icase); while(icase--) { scanf("%s%s",t+1,s+1); //就因为这个地方把长度存放到s[0],t[0]导致一直wa,原来是由于字符太长导致溢出,放到int中一下就ac了 tlen=strlen(t+1); slen=strlen(s+1); getnext(); printf("%d\n",kmp()); } system("pause"); return 0; }