Codeforces 535D - Tavas and Malekas【KMP】
2017-08-18 11:27
393 查看
题意:已知子串p是长度为n字符串的子串。已知p[0]出现的m个位置。问原字符串可能有多少种情况。
数据分析:1 ≤ n ≤ 106 and 0 ≤ m ≤ n - |p| + 1
思路:把位置全填了就好了。但是直接填的复杂度到1e12会T。那么用KMP优化一下有冲突的位置
1.求next 得到 vis1
2.根据a[i]与a[i-1]的关系,判断如何填,能不能填
3.计算没填过的位置数量
数据分析:1 ≤ n ≤ 106 and 0 ≤ m ≤ n - |p| + 1
思路:把位置全填了就好了。但是直接填的复杂度到1e12会T。那么用KMP优化一下有冲突的位置
1.求next 得到 vis1
2.根据a[i]与a[i-1]的关系,判断如何填,能不能填
3.计算没填过的位置数量
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e6+10000; const int MOD=1e9+7; int n,m; int a[maxn]; int Next[maxn]; //不能用next char s[maxn]; bool vis[maxn]; //原串填过的位置 bool vis1[maxn]; //原串那些位置会冲突 int len; ll mod_pow(ll x,ll n)//快速幂 { ll res=1; while(n) { if(n%2==1) res=res*x%MOD; x=x*x%MOD; n/=2; } return res; } void getnext() //得到next { memset(vis,false,sizeof(vis)); memset(vis1,false,sizeof(vis1)); int i=0,j=-1; Next[0]=-1; len=strlen(s); while(i<len) { if(j==-1 || s[i]==s[j]) i++,j++,Next[i]=j; else j=Next[j]; } /*for(int i=0;i<=len;i++) { printf("next[%d]=%d\n",i,next[i]); }*/ int r=len; while(r!=-1) //得到vis1 { vis1[r]=true; r=Next[r]; } /*for(int i=0;i<=len;i++) { printf("vis1[%d]=%d\n",i,vis1[i]); }*/ return ; } int main(void) { cin >> n >> m; scanf("%s",s); for(int i=1; i<=m; i++) scanf("%d",&a[i]); getnext(); sort(a+1,a+1+m); for(int i=1; i<=m; i++) { if(i==1 || a[i]-a[i-1]>=len) //如果是第一个或者相邻的位置长度可以填下一个len { for(int j=a[i];j<=a[i]+len-1;j++) vis[j]=true; } else//否则,如果冲突和不冲突 { if(vis1[ a[i-1]+len-a[i] ]) { for(int j=a[i-1]+len;j<=a[i]+len-1;j++) vis[j]=true; } else { //cout << a[i-1] <<endl; printf("0\n");return 0; } } } ll ans=1; ll cnt=0; for(int i=1;i<=n;i++) { if(vis[i]==false) { cnt++; } } ans=mod_pow(1LL*26,cnt); cout << ans << endl; }
相关文章推荐
- KMP||扩展KMP(Codeforces 535D - Tavas and Malekas )
- KMP Tavas and Malekas:CodeForces 535D
- 【Codeforces Round 299 (Div 2)D】【KMP 本质是最前与最后匹配】Tavas and Malekas 长度为n的匹配串被模板串多位点覆盖的匹配串个数
- codeforces535D:Tavas and Malekas(KMP)
- codeforces 535D. Tavas and Malekas----#299div2D
- Codeforces Round #299 (Div. 2)-D. Tavas and Malekas(kmp)
- codeforces535D:Tavas and Malekas(KMP)
- CF 299 div2 D. Tavas and Malekas(KMP)
- Codeforces Round #299 (Div. 2) D. Tavas and Malekas kmp
- 凸包 点积 Tavas and Pashmaks:CodeForces 535E
- [Codeforces 535B]Tavas and Karafs
- CodeForces 536A---Tavas and Karafs
- 【Codeforces Round #299 (Div. 2) D】Tavas and Malekas
- codeForces 535C.Tavas and Karafs(二分+思维)
- Codeforces 526D Om Nom and Necklace 循环节 kmp
- codeforces 299 div 2 (C Tavas and Karafs)
- codeforces 536 c Tavas and Pashmaks
- 二分 Tavas and Karafs:CodeForces 535C
- Codeforces Round #299 (Div. 2)D. Tavas and Malekas
- 判断s各个前缀是否是 ABABA…ABA的形式 KMP Codeforces 526D - Om Nom and Necklace