800600带通配符的字符串匹配
难度级别:B; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
试题描述

通配符是一类键盘字符,当我们不知道真正字符或者不想键入完整名字时,常常使用通配符代替一个或多个真正字符。通配符有问号(?)和星号(*)等,其中,“?”可以代替一个字符,而“*”可以代替零个或多个字符。你的任务是,给出一个带有通配符的字符串和一个不带通配符的字符串,判断他们是否能够匹配。例如,1?456 可以匹配 12456、13456、1a456,但是却不能够匹配23456、1aa456;2*77?8可以匹配 24457798、237708、27798。

输入
输入有两行,每行为一个不超过20个字符的字符串,第一行带通配符,第二行不带通配符
输出
如果两者可以匹配,就输出“matched”,否则输出“not matched”
输入示例
1*456?
11111114567
输出示例
matched
其他说明
NOI练习库中的试题。

题解:一道神题。。。。。。。。QAQ。。。太hentai了吧。。。QAQ。。。

一开始随便写了一发:

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
using namespace std;
const int maxn=+;
char s[maxn],t[maxn];
inline int read(){
int x=,sig=;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=;
for(;isdigit(ch);ch=getchar())x=*x+ch-'';
return sig?x:-x;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<)putchar('-'),x=-x;
int len=,buf[];while(x)buf[len++]=x%,x/=;
for(int i=len-;i>=;i--)putchar(buf[i]+'');return;
}
void init(){
scanf("%s%s",s,t);bool flag=true;
int n1=strlen(s),n2=strlen(t);
int i,j;
for(i=,j=;i<n1;i++){
//printf("%d %d\n",i,j);
if(s[i]=='?'){
if(j<n2){j++;continue;}
else{flag=false;break;}
}
else if(s[i]=='*'){
while(j<n2&&s[i+]!=t[j])j++;j--;
if(j<n2){j++;continue;}
else{flag=false;break;}
}
else{
if(s[i]==t[j]){j++;continue;}
else{flag=false;break;}
}
}
if(flag&&j==n2)puts("matched");
else puts("not matched");
return;
}
void work(){
return;
}
void print(){
return;
}
int main(){init();work();print();return ;}

发现WA的飞起啊!!!比如12345******???????456****之类的。。。。。

然后发现不会做了。。。。星号的匹配实在太恶心了吧。。。。

最后得到正解。。。。其实,星号的作用是分割两个字符串,那么当星号后的东东不匹配,窝萌就要重新分割,于是想到了AC自动机的fail指针的思想,窝萌可以为每个星号打个标记,当不匹配的时候就往回匹配,就好了。。。。。

写起来真的是hentai啊!!!细节太多了啊!!!

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
using namespace std;
const int maxn=+;
bool match(char*s,char*t){
if(t==NULL||s==NULL)return false;
int n1=strlen(t),n2=strlen(s),mark=,p1=,p2=;
while(p1<n1&&p2<n2){
if(s[p2]=='?'){p1++;p2++;continue;}
if(s[p2]=='*'){p2++;mark=p2;continue;}
if(t[p1]!=s[p2]){
if(p1==&&p2==)return false;
p1-=p2-mark-;p2=mark;continue;
}p1++;p2++;
}
if(p2==n2){
if(p1==n1)return true;
if(s[p2-]=='*')return true;
}
for(;p2<n2;p2++)if(s[p2]!='*')return false;
return true;
}
inline int read(){
int x=,sig=;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=;
for(;isdigit(ch);ch=getchar())x=*x+ch-'';
return sig?x:-x;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<)putchar('-'),x=-x;
int len=,buf[];while(x)buf[len++]=x%,x/=;
for(int i=len-;i>=;i--)putchar(buf[i]+'');return;
}
char s[maxn],t[maxn];
void init(){
cin.getline(s,);
cin.getline(t,);
if(match(s,t))puts("matched");
else puts("not matched");
return;
}
void work(){
return;
}
void print(){
return;
}
int main(){init();work();print();return ;}

COJN 0558 800600带通配符的字符串匹配的更多相关文章

  1. openjudge6252 带通配符的字符串匹配

    描述 通配符是一类键盘字符,当我们不知道真正字符或者不想键入完整名字时,常常使用通配符代替一个或多个真正字符.通配符有问号(?)和星号(*)等,其中,“?”可以代替一个字符,而“*”可以代替零个或多个 ...

  2. 【noi 2.6_6252】带通配符的字符串匹配(DP)

    题意:给出一个带有通配符("?"可以代替一个字符,"*"可以代替零个或多个字符)的a字符串和一个不带通配符的b字符串,判断他们是否能够匹配. 解法:f[i][j ...

  3. 带 like 的字符串匹配查询

    1.百分号通配符  '%'  ,匹配任意长度的字符,甚至包括零字符 例:查询所有以  'a'  字母开头的水果,sql 语句如下 select f_id,f_name from fruits wher ...

  4. 【python cookbook】【字符串与文本】3.利用shell通配符做字符串匹配

    问题:当工作在Linux shell下时,使用常见的通配符模式(即,*.py.Dat[0-9]*.csv等)来对文本做匹配 解决方案:fnmatch模块提供的两个函数fnmatch().fnmatch ...

  5. HDU 5716 带可选字符的多字符串匹配(ShiftAnd)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5716 [题目大意] 给出一个字符串,找出其中所有的符合特定模式的子串位置,符合特定模式是指,该子串 ...

  6. [51nod1532]带可选字符的多字符串匹配

    有一个文本串,它的长度为m (1 <= m <= 2000000),现在想找出其中所有的符合特定模式的子串位置. 符合特定模式是指,该子串的长度为n (1 <= n <= 50 ...

  7. FFT字符串匹配

    本文半原创 参考资料:其实就是照抄的什么参考啊 我们知道KMP可以用来在线性复杂度内进行制胡窜匹配 今天教您一种新方法:用FFT进行字符串匹配 您可能觉得这很玄学,FFT不是做多项式卷积的吗,怎么还可 ...

  8. CF528D Fuzzy Search 字符串匹配+FFT

    题意: DNA序列,在母串s中匹配模式串t,对于s中每个位置i,只要s[i-k]到s[i+k]中有c就认为匹配了c.求有多少个位置匹配了t. 分析: 这个字符串匹配的方式,什么kmp,各种自动机都不灵 ...

  9. zstu.4194: 字符串匹配(kmp入门题&& 心得)

    4194: 字符串匹配 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 206  Solved: 78 Description 给你两个字符串A,B,请 ...

随机推荐

  1. OpenGL中glPushMatrix和glPopMatrix的原理

    glPushMatrix.glPopMatrix操作事实上就相当于栈里的入栈和出栈. 很多人不明确的可能是入的是什么,出的又是什么. 比如你当前的坐标系原点在你电脑屏幕的左上方.如今你调用glPush ...

  2. [CSS3] Using CSS Combinators to Identify Siblings and Descendants in CSS

    CSS combinators allows us to reference the DOM relationship between two or more elements in CSS. < ...

  3. Android(java)学习笔记219:开发一个多界面的应用程序之两种意图

    1.两种意图: (1)显式意图: 在代码里面用intent设置要开启Activity的字节码.class文件: (2)隐式意图: Android(java)学习笔记218:开发一个多界面的应用程序之人 ...

  4. git 的记住用户名和密码和一些常用

    git config --global core.autocrlf falsegit config --global color.ui truegit config --global credenti ...

  5. PHP magic_quotes_gpc的详细使用方法

    工作中遇到的代码 if (ini_get('magic_quotes_gpc')) { function stripslashesRecursive(array $array){ foreach ($ ...

  6. android编译系统学习

    近日接手了后续android新平台项目搭建的任务. 本文内容基于sprd公司提供的android5.1源码. 一.一般的编译工作流程 我们代码一般情况下是从芯片商SPRD/MTK获得的. 源码的编译上 ...

  7. 使用PPRevealSideViewController实现侧滑效果

    使用起来还是比较简单的, 主要是几个步骤 AppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchi ...

  8. MySQL索引及Explain及常见优化

    MySQL索引设计的原则 1. 搜索的索引列,不一定是所要选择的列.换句话说,最适合索引的列是出现在WHERE 子句中的列,或连接子句中指定的列,而不是出现在SELECT 关键字后的选择列表中的列. ...

  9. cocos2d-x 音乐播放猜想

    "SimpleAudioEngine.cpp": void SimpleAudioEngine::playBackgroundMusic(const char* pszFilePa ...

  10. oracle行转列和列转行

    目录[-] 一.行转列 1.1.初始测试数据 1.2. 如果需要实现如下的查询效果图: 1.3.延伸 二.列转行 1.1.初始测试数据 1.2. 如果需要实现如下的查询效果图: 一.行转列 1.1.初 ...