码迷,mamicode.com
首页 > 其他好文 > 详细

codevs1404字符串匹配

时间:2016-05-09 18:47:56      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:

/*
无奈我改了那么久还是看的题解
首先跑一边kmp 几下ans[p]表示总共匹配到长度p的次数
这些不一定都是恰好到p 所以在处理一下 
ans[p]通过处理变成 所有的匹配到长度p的次数
最后答案就是总共匹配到长度p+1的次数 - 总共匹配到长度p的次数
就是恰好匹配到长度p的次数 
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 200010
using namespace std;
int l1,l2,k,s,fail[maxn],ans[maxn];
char s1[maxn],s2[maxn];
void kmp_init()
{
    for(int i=2;i<=l2;i++)
      {
          int p=fail[i-1];
          while(p&&s2[p+1]!=s2[i])
            p=fail[p];
          if(s2[p+1]==s2[i])
            fail[i]=p+1;
          else p=0;
      }
    return ;
}
void kmp_slove()
{
    int p=0;
    for(int i=1;i<=l1;i++)
      {
          while(p&&s2[p+1]!=s1[i])
            p=fail[p];
          if(s2[p+1]==s1[i])p++;
        ans[p]++;
      }
}
int main()
{
    scanf("%d%d%d",&l1,&l2,&k);
    scanf("%s%s",s1+1,s2+1);
    kmp_init();
    kmp_slove();
    for(int i=l2;i>0;i--) 
      ans[fail[i]]+=ans[i];
    for(int i=0;i<l2;i++)
      ans[i]-=ans[i+1];
    for(int i=1;i<=k;i++)
      {
          scanf("%d",&s);
          printf("%d\n",ans[s]);
      }
    return 0;
}

 

codevs1404字符串匹配

标签:

原文地址:http://www.cnblogs.com/yanlifneg/p/5474927.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!