1. 程式人生 > >HDU 2203 親和數(KMP||String)

HDU 2203 親和數(KMP||String)

Problem Description
人隨著歲數的增長是越大越聰明還是越大越笨,這是一個值得全世界科學家思考的問題,同樣的問題Eddy也一直在思考,因為他在很小的時候就知道親和串如何判斷了,但是發現,現在長大了卻不知道怎麼去判斷親和串了,於是他只好又再一次來請教聰明且樂於助人的你來解決這個問題。
親和串的定義是這樣的:給定兩個字串s1和s2,如果能通過s1迴圈移位,使s2包含在s1中,那麼我們就說s2 是s1的親和串。

Input
本題有多組測試資料,每組資料的第一行包含輸入字串s1,第二行包含輸入字串s2,s1與s2的長度均小於100000。

Output
如果s2是s1的親和串,則輸出”yes”,反之,輸出”no”。每組測試的輸出佔一行。

Sample Input
AABCD
CDAA
ASD
ASDF

Sample Output
yes
no

既然是迴圈移位 , 那麼我們可以可以將文字串複製並拼接 那麼所有迴圈所能包含的串 就都包括在內了。

KMP裸題

code :

#include <string.h>
#include <stdio.h>
//#include <bits/stdc++.h>
#define Max 1000005
char a[Max];
char b[Max];
int next[Max];
int m,n;
void getnext()
{
    int
j=0, k=-1; next[0] = -1; while (j<m) { if (k==-1||b[j]==b[k]) { j++; k++; next[j] = k; } else k = next[k]; } } int kmp() { int i=0, j=0; getnext(); while (i<n) { if (j==-1||a[i]==b[j]) { i++; j++; } else
j = next[j]; if (j==m) { return 1; } } return 0; } int main() { while (scanf("%s%s",a,b)!=EOF) { //int n ,m; n = strlen(a); m = strlen(b); for (int i=0; i<n; i++) { a[i+n] = a[i]; } //cout<<a<<" "<<b<<endl; n = 2*n; int t = kmp(); if (t) printf ("yes\n"); else printf ("no\n"); } return 0; }

String 寫法:

既然是迴圈移位 , 那麼我們可以可以將文字串複製並拼接 那麼所有迴圈所能包含的串 就都包括在內了。

介紹一個string 的一個函式 string.find(string1) 在string中尋找 是否存在string1這個子串。

code :

#include<iostream>
#include <string.h>
#include <stdio.h>
#include <bits/stdc++.h>
#define Max 1000005
using namespace std;

int main()
{
    string a, b;
    while (cin>>a>>b)
    {
        if (a.length()<b.length())
        {
            cout<<"no"<<endl;
            continue;
        }
        a += a;
        if (a.find(b)!=-1)
        {
            cout<<"yes"<<endl;
        }
        else
        {
            cout<<"no"<<endl;
        }
    }

    return 0;
}