【HDU 2203】亲和串
2024-09-30 09:59:12
题意
给你一个字符串s1,字符串s2,s1循环移位,使s2包含在s1中,则s2 是s1的亲和串
分析
把s1自身复制一遍接在后面。
方法一: 用strstr函数。
方法二: KMP算法。
方法三: 用C++的string的find函数。
代码
方法一:
#include<cstdio>
#include<cstring>
char s1[],s2[];
int len;
int main()
{
while(~scanf("%s",&s1))
{
len=strlen(s1); for(int i=; i<len; i++)
s1[len+i]=s1[i]; scanf("%s",&s2); if(strstr(s1,s2)-s1>=) printf("yes\n");
else printf("no\n"); memset(s1,,sizeof(s1));
memset(s2,,sizeof(s2));
}
return ;
}
方法二:
#include<cstdio>
#include<cstring>
char S[],T[];
int next[],len; void getNext(){
int i,k=-;
next[]=k;
for(i=;T[i];i++){
while(k>= && T[i]!=T[k+]) k=next[k];
if (T[i]==T[k+]) k++;
next[i]=k;
}
} int KMP(){
int i=,j=;
while(i==-||S[j]&&T[i]){
if(i==-||S[j]==T[i]){
i++;
j++;
}else
i=next[i];
}
if(!T[i])
return j-i+;
return -;
} int main()
{
while(~scanf("%s",S))
{
len=strlen(S);
for(int i=len;i<*len;i++)
S[i]=S[i-len]; scanf("%s",T);
getNext();
if(KMP()<) printf("no\n");
else printf("yes\n");
memset(S,,sizeof(S));
memset(T,,sizeof(T));
}
return ;
}
方法三
#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 ;
}
最新文章
- WCF学习之旅—WCF第二个示例(七)
- iOS第三方Api及常用框架总结
- Centos下防止暴力破解密码 - Denyhost
- 。net 文件依赖缓存
- Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询
- java连接数据库的模糊查询
- Timestamp 使用
- SVN 树冲突的解决方法(Ubuntu 环境)
- DetectEncoding
- 在IIS上发布项目后浏览时报的错:Unable to make the session state request to the session state server
- apache开源项目--TIKA
- easyui源码翻译1.32--MenuButton(菜单按钮)
- arm-linux-gnueabi和arm-linux-gnueabihf 的区别
- Unbutu14.04 启用 root 并禁用guest
- DotNetCore跨平台~问题~NETCoreAPP, Version=v1.0&#39; compatible with one of the target runtimes: &#39;win10-x64
- iostat磁盘IO命令详解
- win7与centos虚拟机的共享文件夹创建
- Excel透视技巧-三级分类统计名单、分类统计数据
- Python高级特性:迭代器和生成器
- scrapy-redis(七):部署scrapy