【NOIP2013模拟】归途与征程
2016-06-01 17:19
363 查看
题目
分析
好吧。。。明显是暴力题。首先,把A串分成只有小写字母组成的小分串,按顺序存放:A[1]、A[2]、A[3]……。
对于同构循环串,显然把两个B串合在一起,成为一个新的C串。C[i...i+m−1](1<=i<=|B|)就是一个同构循环串。
接着设f[i][j]指在C[i+1...|C|]中第一个A[j]的位置,可以用kmp求出来。
然后就可以愉愉快快得暴力啦!
暴力:对于一个同构循环串C[i...i+|B|−1],设k=i-1,每次k调到下一个A的小分串的结尾(即k=f[k][j]+len[j]-1(当前做到的是第j个小分串)),当k>i+|B|-1,那么就是说在C[i...i+|B|−1]中没有对应的A串,break。
注意判断A串的开头结尾不是‘*’的情况。开头情况的:如果f[0][1]<>1就continue。结尾一样。
#include <cmath> #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <queue> const int maxlongint=2147483647; using namespace std; char sm[210000],sn[110][110]; int n,m,ans,tot,pos[110],len[110],tt,f[200500][102]; int next[110]; int kmp(int x) { memset(next,0,sizeof(next)); int j=0; for(int i=2;i<=len[x];i++) { while(j>0 && sn[x][i]!=sn[x][j+1]) j=next[j]; if(sn[x][i]==sn[x][j+1]) j++; next[i]=j; } j=0; for(int i=1;i<=2*m;i++) { while(j>0 && sm[i]!=sn[x][j+1]) j=next[j]; if(sm[i]==sn[x][j+1]) j++; if(j==len[x]) { f[i-j+1-1][x]=i-j+1; } } } int main() { scanf("%s\n%s\n",sn[0]+1,sm+1); n=strlen(sn[0]+1); m=strlen(sm+1); for(int i=1;i<=m;i++) { sm[m+i]=sm[i]; } for(int i=1;i<=n;i++) { if(sn[0][i]!='*') { pos[++tot]=i; len[tot]=0; while(sn[0][len[tot]+1+pos[tot]-1]!='*' && len[tot]+1+pos[tot]-1<=n) { sn[tot][++len[tot]]=sn[0][len[tot]+pos[tot]-1]; } i=len[tot]+pos[tot]-1; } } for(int j=1;j<=tot;j++) kmp(j); for(int i=2*m;i>=0;i--) { for(int j=1;j<=tot;j++) { if(!f[i+1][j]) f[i+1][j]=maxlongint/5; if(!f[i][j]) { f[i][j]=f[i+1][j]; } } } for(int i=1;i<=m;i++) { if(sn[0][1]!='*') { if(f[i-1][1]!=i) continue; } if(sn[0] !='*') { if(f[i+m-1-len[tot]+1-1][tot]!=i+m-1-len[tot]+1) continue; } int k=i-1; for(int j=1;j<=tot;j++) { k=f[k][j]+len[j]-1; if(k>i+m-1) { ans--; break; } } ans++; } printf("%d",ans); }
相关文章推荐
- 第13周项目1:分数类中的运算符重载(3)
- jacob操作office
- 构建动态网站-php的session_start
- XML、JSON详解
- Primary Expression
- 数据库----索引的概念及创建
- 设计模式笔记-Memento模式
- SRAM和DRAM的区别
- 自定义异常信息
- el表达式获取div
- ES6学习笔记(七)--Generator函数与Promise对象
- 20 个常用的 CSS 技巧
- poj 2182
- 数组
- quick cocos2dx脚本加密
- hadoop相关随记
- ES6学习笔记(六)--set,map数据结构和for...of遍历
- [从头学数学] 第232节 定积分
- 从0开始学习 GitHub 系列之「Git 速成」
- hadoop相关随记