zoukankan      html  css  js  c++  java
  • 1451.字符串的移动

    1451.字符串的移动
    Time Limit: 1000 MS         Memory Limit: 65536 K
    Total Submissions: 14 (6 users)         Accepted: 2 (2 users) [ My Solution ]
    Description

    给定非空字符串S和正整数k, 我们定义函数Shift(S, k)表示将字符串S循环右移k位, 例如Shift("abc", 1) = "cab", Shift("abc", 2) = "bca", 现在给你两个长度相同的非空字符串S和T, 你需要找到一个小于两个字符串长度的正整数k, 满足Shift(S, k) = T。

    Input

    输入有2行, 分别为字符串S 和 T (1 <= |S| = |T| <= 100,000), 输入保证两个字符串中的字符都只由小写字母构成。

    Output

    若不存在满足题意的k则输出-1, 否则输出任意一个满足题意的k都可以通过本题。

    Sample Input

    abcab

    ababc

    Sample Output

    2

    Hint

    这是一道SPECIAL JUDGE的题目

    Source
    xmu
     
     
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    using namespace std;
    
    const int maxn=100010;
    
    char s1[maxn*2],s2[maxn];
    int next[maxn],flag,ans;
    
    void getnext(int len){
        int i=0,j=-1;
        next[0]=-1;
        while(i<len){
            if(j==-1 || s2[i]==s2[j]){
                i++;j++;
                if(s2[i]==s2[j])
                    next[i]=next[j];
                else
                    next[i]=j;
            }else
                j=next[j];
        }
    }
    
    void KMP(int len1,int len2){
        getnext(len2);
        int i=0,j=0;
        while(i<len1){
            if(j==-1 || s1[i]==s2[j]){
                i++;j++;
            }else
                j=next[j];
            if(j==len2){
                flag=1;
                ans=i;
                break;
            }
        }
    }
    
    int main(){
    
        //freopen("input.txt","r",stdin);
    
        int len1,len2;
        while(cin>>s1>>s2){
            len1=strlen(s1);
            len2=strlen(s2);
            if(len1!=len2){
                cout<<"-1"<<endl;
                continue;
            }
            for(int i=0;i<len1;i++)
                s1[len1+i]=s1[i];
            flag=0;
            KMP(2*len1,len2);
            if(flag)
                cout<<(2*len1-ans)%len1<<endl;
            else
                cout<<"-1"<<endl;
        }
        return 0;
    }
  • 相关阅读:
    Kubernetes 命令行工具之kubctl
    新一代数据库之Etcd 简介
    算法题 打家劫舍(动态规划)
    算法题 位1的个数
    Class强制类型转换
    算法题 阶乘后的零
    算法题 Excel表列序号
    多数元素
    有序数组两数之和
    一杯果汁和一杯水的故事
  • 原文地址:https://www.cnblogs.com/jackge/p/2963259.html
Copyright © 2011-2022 走看看