【HDU 2203】亲和串
2016-02-14 17:11
253 查看
题
方法一: 用strstr函数。
方法二: KMP算法。
方法三: 用C++的string的find函数。
题意
给你一个字符串s1,字符串s2,s1循环移位,使s2包含在s1中,则s2 是s1的亲和串分析
把s1自身复制一遍接在后面。方法一: 用strstr函数。
方法二: KMP算法。
方法三: 用C++的string的find函数。
代码
方法一:
#include<cstdio> #include<cstring> char s1[200009],s2[100009]; int len; int main() { while(~scanf("%s",&s1)) { len=strlen(s1); for(int i=0; i<len; i++) s1[len+i]=s1[i]; scanf("%s",&s2); if(strstr(s1,s2)-s1>=0) printf("yes\n"); else printf("no\n"); memset(s1,0,sizeof(s1)); memset(s2,0,sizeof(s2)); } return 0; }
方法二:
#include<cstdio> #include<cstring> char S[200005],T[100005]; int next[100005],len; void getNext(){ int i,k=-1; next[0]=k; for(i=1;T[i];i++){ while(k>=0 && T[i]!=T[k+1]) k=next[k]; if (T[i]==T[k+1]) k++; next[i]=k; } } int KMP(){ int i=0,j=0; while(i==-1||S[j]&&T[i]){ if(i==-1||S[j]==T[i]){ i++; j++; }else i=next[i]; } if(!T[i]) return j-i+1; return -1; } int main() { while(~scanf("%s",S)) { len=strlen(S); for(int i=len;i<2*len;i++) S[i]=S[i-len]; scanf("%s",T); getNext(); if(KMP()<0) printf("no\n"); else printf("yes\n"); memset(S,0,sizeof(S)); memset(T,0,sizeof(T)); } return 0; }
方法三
#include<iostream> using namespace std; int main() { string P,T; while(cin>>P>>T) { P+=P; if(P.find(T)!=string::npos)cout<<"yes"<<endl; else cout<<"no"<<endl; } return 0; }
相关文章推荐
- 学习MongoDB(三) Add an Arbiter to Replica Set 集群中加入仲裁节点
- Visual Studio 2008 可扩展性开发(六):操作Solution Explorer
- jquery ajax No 'Access-Control-Allow-Origin' header is present on the requested resource
- nginx referer限制
- Python语言实践分析 -- 默认参数
- Visual Studio 2008 可扩展性开发(五):操作Solution、Project和ProjectItem
- 【JS学习笔记】基本包装类型
- 谈谈自己处理拍照剪裁的一些经验和遇到的问题
- 【bzoj3171】[Tjoi2013]循环格 (费用流)
- Zabbix高可用,实现zabbix的无缝切换,无故障时间
- redis练习手册<十一>set主要操作函数小结
- JavaWeb学习总结(二)——Tomcat服务器学习和使用(一)
- 优化 Android 线程和后台任务开发
- unity, ugui button 禁止重复点击
- MySQL Workbench 6.3 CE 不显示MySql、infomation_schema等数据库
- 用Azure CLI批量上传文件
- Java类初始化和实例化中的2个“雷区”
- 关于烂代码的那些事(上)
- 银联的MAC校验
- POS终端MAC算法-C语言实现