hdu 2203 亲和串

简介: 点击打开链接hdu 2203 思路:kmp 分析: 1 题目要求的是给定字符串s1 和 s2,问s1能否通过移位得到使得s2包含在s1里面。

点击打开链接hdu 2203


思路:kmp


分析:
1 题目要求的是给定字符串s1 和 s2,问s1能否通过移位得到使得s2包含在s1里面。
2 很显然的kmp的模板题,只须在s1后面在添上一个s1即可。这里特别注意strcat的使用
3 strcat函数,函数的原行strcat(char *s , char *p);注意这里的s和p所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串;所以假设s = “abc”,现在想得到“abcabc”那么不能直接的strcat(s , s),而是先用一个tmp数组存储s,即strcpy(tmp , s , sizeof(s)) , 然后在strcat(s , tmp);

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

#define MAXN 200010

char text[MAXN];
char pattern[MAXN];
int next[MAXN];

void getNext(){
   int m = strlen(pattern);
   next[0] = next[1] = 0;
   for(int i = 1 ; i < m ; i++){/*这里是从1开始的*/
      int j = next[i];
      while(j && pattern[i] != pattern[j])
          j = next[j];
      next[i+1] = pattern[i] == pattern[j] ? j+1 : 0; 
   }
}

bool find(){
   int n = strlen(text);
   int m = strlen(pattern);
   int j = 0;/*模式串的起点*/
   for(int i = 0 ; i < n ; i++){
      while(j && pattern[j] != text[i])
          j = next[j];/*顺着失配边走*/
      if(pattern[j] == text[i])/*这个要先判断才判断j是否等与m*/
          j++; 
      if(j == m)/*找到了return true*/
        return true;
   }
   return false;
}

int main(){
   while(scanf("%s" , text) != EOF){
       scanf("%s" , pattern);
       
       char tmp[MAXN];
       memcpy(tmp , text , sizeof(text));/*先复制给tmp*/          
       strcat(text , tmp);/*tmp在复制给text*/

       getNext();
       if(find())
         printf("yes\n");
       else
         printf("no\n");  
   }
   return 0;
}




目录
相关文章
|
6月前
HDU-2089-不要62
HDU-2089-不要62
33 0
|
机器学习/深度学习 算法
|
Java BI
HDU 2034 人见人爱A-B
人见人爱A-B Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 77157    Accepted Submission(s): 21509 Problem Description 参加过上个月月赛的同学一定还记得其中的一个最简单的题目,就是{A}+{B},那个题目求的是两个集合的并集,今天我们这个A-B求的是两个集合的差,就是做集合的减法运算。
1158 0
|
C++ Java
HDU1880
题意就是根据咒语查功能,根据功能查看是否存在相应咒语,题意简单,不过是道不错的练习题。         下面的都MLE了,听说C++用G++提交才可以AC,否则也MLE;方法很多,不想做了……         方法一:我用Java的HashMap一直MLE,即便由value反查key减少映射数也一样MLE,听说C++的map可以AC。
1082 0
|
Java 测试技术
HDU 1847
Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3204    Accepted Submission(s): 2008 Problem Description 大学英语四级考试就要来临了,你是不是在紧张的复习?也许紧张得连短学期的ACM都没工夫练习了,反正我知道的Kiki和Cici都是如此。
854 0