您的位置:首页 > 其它

HDU 6153 A secret(kmp)

2017-11-09 13:41 411 查看
似乎正解是扩展kmp的模版题.

但是kmp也可以做.

kmp有两种.一种是在每一次成功匹配后都算一次.

这种是正解呢.

因为kmp,其实就是遍历了所有会有重叠的情况,但是一些毫无可能的就被忽略了,但是我们只记录成功匹配一个之后的情况的话,会有在while中的匹配被忘记.所以没一个成功匹配到之后,都有他的next被忽略了.

一种是在结束匹配是算一次,这种要等差数列计算.

反正这题很迷幻.

靠我总结不下去了,还是不懂啊.

就当存个kmp,我好菜啊

/* Farewell. */
#include <iostream>
#include <vector>
#include <cstdio>
#include <string.h>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <string>
#include <cmath>
#include <bitset>
#include <iomanip>
#include <set>
using namespace std;
#define gcd __gcd
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define MP make_pair
#define MT make_tuple
#define PB push_back
typedef long long  LL;
typedef unsigned long long ULL;
typedef pair<int,int > pii;
typedef pair<LL,LL> pll;
typedef pair<double,double > pdd;
typedef pair<double,int > pdi;
const int INF = 0x7fffffff;
const LL INFF = 0x7f7f7f7fffffffff;
#define debug(x) std::cerr << #x << " = " << (x) << std::endl
const int MAXM = 5e3+17;
const int MOD = 1e9+7;
const int MAXN = 1e6+17;
char s[MAXN],p[MAXN];
string tmp;
LL Next[MAXN];
LL arv[MAXN];
void getNext(string p)
{
memset(Next, 0, sizeof(Next));
int m = p.length();
int i = 0,j = -1;
Next[0] = -1;
while (i < m)
{
if (j == -1 || p[i] == p[j])
{
i++;j++;
Next[i] = j;
}else j = Next[j];
}
}
void kmp(string s,string p)
{
memset(arv, 0, sizeof(arv));
int i = 0, j = 0,n = s.length(),m = p.length();
getNext(p);
for(int i =0 ;i<n;++i)
{
while(j > 0 && s[i] != p[j])
{
arv[j]++;
j = Next[j];
}
if(s[i] == p[j])
j++;
if(j == m)
{
arv[j]++;
j = Next[j];
}
}
}
int main(int argc, char const *argv[])
{
#ifdef GoodbyeMonkeyKing
freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
#endif
int t;
cin>>t;
while(t--)
{
scanf("%s%s",s,p);
string a(s,&s[strlen(s)]);
string b(p,&p[strlen(p)]);
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
kmp(a,b);
LL ans = 0;
for (LL i = 0; i <= b.length(); ++i)
ans = (ans+(1LL*arv[i]*(1LL*(i+1)*i)/2)%MOD)%MOD;
cout<<ans%MOD<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  kmp