@lychee123
2017-08-18T15:11:29.000000Z
字数 818
阅读 1140
数据结构
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxn=1e6+6;int Next[maxn];void getnext(char s[])//对小串的处理{int l=strlen(s);Next[0]=-1;int j=-1;for(int i=1;i<l;i++){while(j>=0&&s[j+1]!=s[i])j=Next[j];if(s[j+1]==s[i])j++;Next[i]=j;}}int getfind(char s[],char s1[])//大串s与小串s1的匹配{int l=strlen(s);int l1=strlen(s1);int i,j=-1,ans=0;for(i=0;i<l;i++){while(j>=0&&s1[j+1]!=s[i])j=Next[j];if(s1[j+1]==s[i])j++;if(j==l1-1)ans++;}return ans;}char s1[10010];char s[1000010];int main(){int n;scanf("%d",&n);while(n--){memset(Next,0,sizeof(Next));scanf("%s",s1);scanf("%s",s);getnext(s1);int ans=getfind(s,s1);printf("%d\n",ans);}return 0;}
利用容斥原理计数. 设长度为 , 恰好用了 个字符的方案数为 , 那么
