题解

130 条题解

  • 10
    @ 2017-10-30 19:27:36

    四个月之前弃的坑这次一遍填起来了 (ง •_•)ง
    其实我们可以看到这个题是可以单纯考虑首字母的(贪心的思路,如果两个首字母无法被剩下的倒序字串以相同的距离达到那么这种组合一定是错的,当然也可能使数据太水,貌似有人用这种做法,以不同顺序选取首字母来判断,得到的结果是不一样的,但这不妨碍我们水题)

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int n;
    string a1,a2,a3;
    int jud(string a,string b,string c)
    {
        int i,j;
        for(i=0,j=n-1;i<=n-1,j>=0;i++,j--)
        {
            int t1=a[i]-'a'+1;
            int t2=b[i]-'a'+1;
            int t3=c[j]-'a'+1;
            int mark=0;
            for(int k=0;k<=26;k++)//这里完全可以判到6,为了防止上面说的情况发生还是判到26。
            {
                if(t1==(t3+k-1)%26+1 && t2==(t3-k-1+26)%26+1)//玄妙的取模运算,可以省掉四个判断吧。
                {
                mark=1;break;}
                if(t2==(t3+k-1)%26+1 && t1==(t3-k-1+26)%26+1)
                {
                mark=1;break;}
            }
            if(mark)
            {
            continue;
            }
            else
            return 0;
        }
        return 1;
    }
    void output(string a)//反向输出找到的倒序字串
    {
        int i;
        for(i=n-1;i>=0;i--)
        cout<<a[i];
    }
    int main()
    {
        cin>>n;
        cin>>a1>>a2>>a3;
        if(jud(a1,a2,a3))//分别判断倒序的字串究竟是哪个
        {
            output(a3);
            return 0;
        }
        if(jud(a2,a3,a1))
        {
            output(a1);
            return 0;
        }
        if(jud(a3,a1,a2))
        {
            output(a2);
            return 0;
        }
    }
    
    
  • 5
    @ 2018-02-09 11:32:44
    \\c++有reverse函数可以直接调用
    #include<iostream>
    #include<string>
    #include<algorithm>
    
    using namespace std;
    
    int n;string s1,s2,s3;
    
    bool judge(string s1,string s2,string s3){
        reverse(s1.begin(),s1.end());
        bool b=1;
        for(int i=0;i<n;i++){
            if(((s2[i]-'a'+s3[i]-'a')-2*(s1[i]-'a'))%26!=0){
                b=0;
                break;
            }
        }
        return b;
    }
    
    int main(){
        cin>>n;
        cin>>s1>>s2>>s3;
        if(judge(s1,s2,s3))
            reverse(s1.begin(),s1.end()),cout<<s1<<endl;
        else if(judge(s2,s1,s3))
            reverse(s2.begin(),s2.end()),cout<<s2<<endl;
        else if(judge(s3,s2,s1))
            reverse(s3.begin(),s3.end()),cout<<s3<<endl;
        
        return 0;
    }
    
    • @ 2018-11-10 19:10:02

      注释写反了。。。

  • 5
    @ 2017-09-20 13:01:40

    如果你是因为第四个点过不去的话,我有话说
    题目表述有问题:
    2、将字符串中每个字母变为其之后第k个字母,定义z之后的字母为a,其中0≤k≤6且为未知数。
    3、将字符串中每个字母变为其之前第k个字母,定义a之前的字母为z,k同2所述。

    第三点的“k同2所述”指的是向前向后都是移K位
    我以为是说向前移动的位数和向后移动的位数都是未知的,不一定相等的。

    因为这个WA了第四个点无数次,大家注意了。

  • 3
    @ 2018-02-14 19:40:23

    假设一个是反转的,则另外两个字符串的字符都关于原字符串的对应字符对称

    #include<bits/stdc++.h>
    int av(int a,int b){
        return (a+b)/2;
    }
    int rav(int a,int b){
        int c=av(a,b)+13;
        return c<=26?c:c-26;
    }
    void reverse(char a[]){
        int n=strlen(a+1);
        for(int i=1;i<=n/2;++i) std::swap(a[i],a[n-i+1]);
    }
    int main(){
        char a[23333],b[23333],c[23333];
        int n,flag=1;
        scanf("%d",&n);
        scanf("%s%s%s",a+1,b+1,c+1);
        for(int i=1;i<=n;++i){
            a[i]=a[i]-'a'+1;
            b[i]=b[i]-'a'+1;
            c[i]=c[i]-'a'+1;
        }
        reverse(a);
        for(int i=1;i<=n;++i){
            if((a[i]==av(b[i],c[i]))||a[i]==rav(b[i],c[i])) continue;
            flag=0;
            break;
        }
        if(flag==1){
            for(int i=1;i<=n;++i) a[i]=a[i]+'a'-1;
            printf("%s",a+1);
            return 0;
        }
        reverse(a);
        reverse(b);flag=1;
        for(int i=1;i<=n;++i){
            if((b[i]==av(a[i],c[i]))||b[i]==rav(a[i],c[i])) continue;
            flag=0;
            break;
        }
        if(flag==1){
            for(int i=1;i<=n;++i) b[i]=b[i]+'a'-1;
            printf("%s",b+1);
            return 0;
        }
        reverse(c);
        for(int i=1;i<=n;++i) c[i]=c[i]+'a'-1;
        printf("%s",c+1);
    }
    
  • 3
    @ 2017-09-20 16:21:01

    其实只需要判断第一位即可。

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    string reverse(string src)
    {
        string res = "";
        for (int i = src.size() - 1; i >= 0; i--)
            res += src[i];
        return res;
    }
    
    int main()
    {
        string a, b, c;
        int n;
        cin >> n;
        cin >> a >> b >> c;
        if ((a[0] - reverse(b)[0] + c[0] - reverse(b)[0]) % 26 == 0)
            cout << reverse(b) << endl;
        else if ((a[0] - reverse(c)[0] + b[0] - reverse(c)[0]) % 26 == 0)
            cout << reverse(c) << endl;
        else
            cout << reverse(a) << endl;
        return 0;
    }
    
    • @ 2019-12-21 01:18:02

      只判断第一位肯定是不对的,如果所有test都过了只能是他的数据不好。

      试试
      2 ad eb cz

      正确答案应该是da,但这个算法会输出be

  • 3
    @ 2017-01-24 09:23:31

    "var
    a,b,c,s:ansistring;
    n,i:longint;
    begin
    readln(n);readln(a);readln(b);readln(c);
    if (ord(a[1])+ord(b[1])-2*ord(c[n]))mod 26=0 then s:=c
    else if (ord(a[1])+ord(c[1])-2*ord(b[n]))mod 26=0 then s:=b
    else s:=a;
    for i:=n downto 1 do write(s[i]);
    end."

  • 3
    @ 2016-04-02 16:11:13

    #include<stdio.h>
    #include<stdlib.h>
    int main()
    {
    char a[100001], b[100001], c[100001];
    int n,i;
    scanf("%d", &n);
    scanf("%s", a);
    scanf("%s", b);
    scanf("%s", c);
    if ((a[0]+b[0]-2*c[n-1])%26==0)
    for (i = n - 1; i >= 0; i--)
    printf("%c", c[i]);
    else if ((a[0] + c[0] - 2 * b[n - 1]) % 26 == 0)
    for (i = n - 1; i >= 0; i--)
    printf("%c", b[i]);
    else
    {
    for (i = n - 1; i >= 0; i--)
    printf("%c", a[i]);
    }
    return 1;
    }

    • @ 2017-09-20 09:21:30

      你的代码re了

  • 2
    @ 2018-07-25 09:40:55
    • 模拟题,只要按照题目要求模拟比较即可求出结果
    • 代码使用了全排列来枚举所有的情况,这样可以简化题目对下标的处理
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    
    using namespace std;
    
    char arr[3][10002];
    char res[10002];
    
    int main()
    {
        //freopen("input.txt", "r", stdin);
        
        int i, j, k;
        int n;
        scanf("%d", &n);
        
        for(i = 0; i < 3; ++i)
        {
            scanf("%s", arr[i]);
        }
        
        //for(i = 0; i < 3; ++i) printf("%s\n", arr[i]);
        int order[3] = {0, 1, 2};
        do
        {
            //printf("%s\n%s\n%s\n", arr[order[0]], arr[order[1]], arr[order[2]]);
            
            //情况(1)
            for(i = 0; i < n; ++i) res[i] = arr[order[0]][n - 1 - i];
            
            //情况(2)
            k = (arr[order[1]][0] - res[0] + 26) % 26;
            for(j = 1; j < n; ++j)
            {
                if((arr[order[1]][j] - res[j] + 26) % 26 != k) break;
            }
            if(j < n) continue;
            
            //情况(3)
            for(j = 0; j < n; ++j)
            {
                if((res[j] - arr[order[2]][j] + 26) % 26 != k) break; 
            } 
            if(j < n) continue;
            break;
        }
        while(next_permutation(order, order + 3));
        
        printf("%s\n", res);
        
        //fclose(stdin);
        
        return 0;
    }
    
  • 2
    @ 2018-03-07 23:42:22

    看到各位dalao一般都是用reverse函数或是只判断第一位,我这里说一下(比较)规范的完整的模拟做法。基本思路就是循环k(0——6)然后对于每个k,我们对给出的三个字符串(a[],b[],c[])分别按三种规则还原(a[]得到a1[],a2[],a3[],b和c也一样)然后判断得到的9个还原字符串中,哪三个相同(注意:这里只有6种情况,而非27种,因为给出的三个字符串一定是按不同规则得到的),那么这个相同的字符串就是答案(这里判断字符串相等我是敲了一个pd()函数,用strncmp应该也可以)ok,大致思路就是这样,上代码。

    #include<iostream>
    #include<cstring>
    using namespace std;
    int n;
    char a[10005],b[10005],c[10005],a1[10005],b1[10005],c1[10005],a2[10005],b2[10005],c2[10005],a3[10005],b3[10005],c3[10005];
    bool pd(char x[],char y[])
    {
        for(int i=1;i<=n;++i)
        if(x[i]!=y[i])
        return 0;
        return 1;
    }
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;++i)
        cin>>a[i];
        for(int i=1;i<=n;++i)
        cin>>b[i];
        for(int i=1;i<=n;++i)
        cin>>c[i];
        for(int k=0;k<=6;++k)
        {
            
        for(int i=1;i<=n;++i)
        {
            a1[i]=a[n-i+1];
            a1[n-i+1]=a[i];
        }
        for(int i=1;i<=n;++i)
        {
            a2[i]=a[i]+k;
            if(a2[i]>122)
            a2[i]-=26;
        }
        for(int i=1;i<=n;++i)
        {
            a3[i]=a[i]-k;
            if(a3[i]<97)
            a3[i]+=26;
        }
        for(int i=1;i<=n;++i)
        {
            b1[i]=b[n-i+1];
            b1[n-i+1]=b[i];
        }
        for(int i=1;i<=n;++i)
        {
            b2[i]=b[i]+k;
            if(b2[i]>122)
            b2[i]-=26;
        }
        for(int i=1;i<=n;++i)
        {
            b3[i]=b[i]-k;
            if(b3[i]<97)
            b3[i]+=26;
        }
        for(int i=1;i<=n;++i)
        {
            c1[i]=c[n-i+1];
            c1[n-i+1]=c[i];
        }
        for(int i=1;i<=n;++i)
        {
            c2[i]=c[i]+k;
            if(c2[i]>122)
            c2[i]-=26;
        }
        for(int i=1;i<=n;++i)
        {
            c3[i]=c[i]-k;
            if(c3[i]<97)
            c3[i]+=26;
        }   
        if(pd(a1,b2)&&pd(a1,c3))
        {
            for(int i=1;i<=n;++i)
            cout<<a1[i];
            return 0;
        }
        if(pd(a1,b3)&&pd(a1,c2))
        {
            for(int i=1;i<=n;++i)
            cout<<a1[i];
            return 0;
        }
        if(pd(a2,b1)&&pd(a2,c3))
        {
            for(int i=1;i<=n;++i)
            cout<<a2[i];
            return 0;
        }
        if(pd(a2,b3)&&pd(a2,c1))
        {
            for(int i=1;i<=n;++i)
            cout<<a2[i];
            return 0;
        }
        if(pd(a3,b1)&&pd(a3,c2))
        {
            for(int i=1;i<=n;++i)
            cout<<a3[i];
            return 0;
        }
        if(pd(a3,b2)&&pd(a3,c1))
        {
            for(int i=1;i<=n;++i)
            cout<<a3[i];
            return 0;
        }
        
        }
        return 0;
    }
    
  • 2
    @ 2017-09-20 09:19:55

    每位都要判断

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    const int maxn = 1e5 + 7;
    char a[maxn], b[maxn], c[maxn];
    int n;
    bool chk( char* a, char* b, char* c){
        for ( int i=0; i<n; i++ ){
            int x=b[i]-'a';
            int y=c[i]-'a';
            int z=a[n-i-1]-'a';
            if( (x+y-2*z)%26 != 0 ) return false;
        }
        return true;
    }
    int main(){
        scanf("%d", &n );
        scanf("%s", a);
        scanf("%s", b);
        scanf("%s", c);
        if( chk(a,b,c) ){
            for ( int i=n-1; i>=0; i-- ) printf("%c", a[i] );
        }else if( chk(b,a,c) ){
            for ( int i=n-1; i>=0; i-- ) printf("%c", b[i] );
        }else {
            for ( int i=n-1; i>=0; i-- ) printf("%c", c[i] );
        }
        return 0;
    }
    
    • @ 2019-12-21 00:59:38

      这个算法只适用于这道题已知答案存在,不然像
      2 ec ce dd
      这样的input就会得到dd这个错误答案而不能返回不存在正确答案。

      至于为什么已知input正确算法就能给出正确的output我觉得是巧合... 我没法证明算法的正确性但也没想到反例,所以只是很直觉地觉得算法应该是正确的。

  • 2
    @ 2016-03-23 00:03:15
    var n,i,j,k,kk,x,y:longint;
        a:array [1..3,0..20000] of longint;
        ch:char;
    
    procedure print;
      var i:longint;
      begin
        for i:=1 to n do
          write(chr(a[kk,n-i+1]+97));
        halt;
      end;
    
    procedure swap(var a,b:longint);
      var t:longint;
      begin
        t:=a;
        a:=b;
        b:=t;
      end;
    
    function pd:boolean;
      var i,j:longint;
      begin
        for i:=1 to n do if (a[x,i]-k+26) mod 26<>a[kk,n-i+1] then exit(false);
        for i:=1 to n do if (a[y,i]+k+26) mod 26<>a[kk,n-i+1] then exit(false);
        exit(true);
      end;
    
    begin
      readln(n);
      for i:=1 to 3 do
      begin
        for j:=1 to n do
        begin
          read(ch);
          a[i,j]:=ord(ch)-97;
        end;
        readln;
      end;
      for kk:=1 to 3 do
      begin
        case kk of
          1:begin x:=2; y:=3; end;
          2:begin x:=1; y:=3; end;
          3:begin x:=1; y:=2; end;
        end;
        for k:=0 to 6 do
        begin
          if pd then print;
          swap(x,y);
          if pd then print;
        end;
      end;
    end.
    

    第一次交就过了,然而代码巨长

  • 1
    @ 2021-06-04 05:27:14
    #include <cstring>
    #include <cstdio>
    
    int main()
    {
        int n, k, flag = 1;
        char s1[62510], s2[62510], s3[62510], s[62510];
        scanf("%d\n%s\n%s\n%s", &n, s1, s2, s3);
        for (int i = 0; i < n; i++)
        {
            s[i] = s1[n-1-i];
            k = s[0] - s2[0];
            if ((s[i] - s2[i] != k) && (s[i] - s2[i] - 26 != k) && (s[i] - s2[i] + 26 != k)) flag = 0;
            if ((s[i] - s3[i] != -k) && (s[i] - s3[i] - 26 != -k) && (s[i] - s3[i] + 26 != -k)) flag = 0;
        }
        if (!flag){
            flag = 1;
            for (int i = 0; i < n; i++)
            {
                s[i] = s2[n-1-i];
                k = s[0] - s3[0];
                if ((s[i] - s3[i] != k) && (s[i] - s3[i] - 26 != k) && (s[i] - s3[i] + 26 != k)) flag = 0;
                if ((s[i] - s1[i] != -k) && (s[i] - s1[i] - 26 != -k) && (s[i] - s1[i] + 26 != -k)) flag = 0;
            }
        }
        if (!flag){
            flag = 1;
            for (int i = 0; i < n; i++)
            {
                s[i] = s3[n-1-i];
                k = s[0] - s1[0];
                if ((s[i] - s1[i] != k) && (s[i] - s1[i] - 26 != k) && (s[i] - s1[i] + 26 != k)) flag = 0;
                if ((s[i] - s2[i] != -k) && (s[i] - s2[i] - 26 != -k) && (s[i] - s2[i] + 26 != -k)) flag = 0;
            }
        }   
        if (flag) {
            printf("%s", s);
        }
        return 0;   
    }
    
  • 1
    @ 2020-02-02 19:12:57

    完整的解题思路:
    以反转字符串为突破,三行字符串的每一行字符串的反转都可能是原字符串;
    因此我们定义一个函数对三种情况分别进行判断;
    具体判断思路就是:
    1.原字符串与两个移位字符串,每个字符的差的绝对值都是k或26-k;
    2.两个移位字符串的差的绝对值都是2k或26-2k;

    #include<iostream>
    using namespace std;
    char tstr[10000];
    char* turnstr(const char str1[], int length) {//翻转字符串
        for (int i = 0; i < length; i++)tstr[i] = str1[length - i - 1];
        *(tstr + length) = 0;
        return tstr;
    }
    bool suful(const char str1[], const char str2[], int k, int length) {//判断是否为定距离移动字符串
        for (int i = 0; i < length; i++)
        {
            if (abs(str1[i] - str2[i]) != k && abs(str1[i] - str2[i]) != 26 - k) {
                return false;
            }
        }
        return true;
    }
    bool jstr(const char str1[], const char str2[], const char str3[], int length) {//判断第一个字符串是否满足条件
        char* str0 = turnstr(str1, length);
        int k;
        k = abs(str0[0] - str2[0]);
        if (k >= 20)k = 26 - k;
        if (k >= 0 && k <= 6 && suful(str0, str2, k, length) && suful(str2, str3, 2 * k, length) && suful(str0, str3, k, length))return true;
        else return false;
    }
    int main()
    {
        int length;
        char str1[10000], str2[10000], str3[10000];
        cin >> length >> str1 >> str2 >> str3;
        if (jstr(str3, str1, str2, length))cout << turnstr(str3, length);
        else if (jstr(str2, str1, str3, length))cout << turnstr(str2, length);
        else if (jstr(str1, str2, str3, length))cout << turnstr(str1, length);
        return 0;
    }
    
  • 1
    @ 2019-12-24 22:58:53

    这题的测试数据不好,我试了下只判断第一位就能拿满分。这个算法是每一位去验证大的字符串由翻转字符串+k获得,小的字符串由翻转字符串-k获得。这样就能保证算法验证得到答案当且仅当input的答案是正确的。

    #include <iostream>
    #include <algorithm>
    #include <string>
    using namespace std;
    
    int n;
    string s[3], r[3];
    
    int code(char c) {
        return c - 'a';
    }
    
    bool test(int index) {
        // cout << "test " << index << endl;
        int a = index,
            b = (index + 1) % 3,
            c = (index + 2) % 3;
        int k = (s[c][0] - r[a][0] + 26) % 26;
        // 这里把b改成小的那个string的index, c改成大的string index
        if (k > 13) {
            k = 26 - k;
            b = (b + 1) % 3;
            c = (c + 2) % 3;
        }
        // cout << "  " << k << " " << s[a] << " " << s[b] << " " << s[c] << endl;
        // 检查是不是每一位都是小的又-k得到,大的由+k得到。
        for (int i = 0; i < n; i++) {
            // cout << "    " << r[a][i] << " " << s[b][i] << " " << s[c][i] << endl;
            if (code(s[c][i]) != (code(r[a][i]) + k + 26) % 26 || code(s[b][i]) != (code(r[a][i]) - k + 26) % 26)
                return 0;
        }
        return 1;
    }
    
    int main(int argc, char *argv[]) {
        // freopen("a.in", "r", stdin);
        cin >> n;
        for (int i = 0; i < 3; i++) {
            cin >> s[i];
            r[i] = s[i];
            reverse(r[i].begin(), r[i].end());
        }
        for (int i = 0; i < 3; i++) {
            if (test(i)) {
                cout << r[i] << endl;
                return 0;
            }
        }
    
        fputs("error\n", stderr);
        exit(1);
    }
    
    
  • 1
    @ 2018-09-24 18:58:11

    三个操作加一个CHECK,模块化三个操作加一个CHECK,模块化写着很简单,暴力检验就行了

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #define LL long long
    using namespace std;
    char s[4][10001],c[4][10001];
    int n;
    bool check(){
        for(int i=1;i<=n;++i)
            if(c[1][i]!=c[2][i]||c[2][i]!=c[3][i])return 0;
        for(int i=1;i<=n;++i)printf("%c",c[1][i]);
        return 1;   
    }
    void r1(int x){
        for(int i=1;i<=n;++i)
            c[x][i]=s[x][n-i+1];
    }
    
    void r2(int x,int K){
        for(int i=1;i<=n;++i)
            c[x][i]=s[x][i]+K>'z'? s[x][i]+K-26:s[x][i]+K;
    }
    
    void r3(int x,int K){
        for(int i=1;i<=n;++i)
            c[x][i]=s[x][i]-K>='a'? s[x][i]-K:s[x][i]-K+26;
    }
    int main(){
        scanf("%d",&n);
        getchar();
        for(int i=1;i<=3;++i){
            for(int j=1;j<=n;++j){
            scanf("%c",&s[i][j]);
            }
            getchar();
        }
        for(int k=0;k<=6;++k){
            for(int i=1;i<=3;++i){
                r2(i,k);
                for(int j=1;j<=3;++j){
                    if(i==j)continue;
                    r3(j,k);r1(6-i-j);
                    if(check())return 0;
                }
            }
        }
        
        
        return 0;
    } 
    
  • 1
    @ 2018-08-10 20:51:10

    python这么好用,难道就没人用python???

    a=int(input())
    b=input()
    c=input()
    d=input()
    B = b[::-1]
    C=c[::-1]

    def judge(b,c,d):
    B = b[::-1]
    Flag=True
    for i in range(a):
    #这句话是本题的精髓所在,由于26个字母总是循环的,
    # 因此可以不用考虑是否超过范围的问题,
    # 直接相减并判断是否是26的倍数,则可以断定是否符合要求
    if ((ord(c[i])-ord('a')+ord(d[i])-ord('a'))-2*(ord(B[i])-ord('a')))%26!=0:
    Flag=False
    break
    if Flag==True:
    print(B)

    if b!=c!=d:#当出现类似b:aba,c:aba,d:aba这样的情况的时候,
    # 连续判断会连续输出三个结果,这不是我们想要的结果
    judge(b,c,d)
    judge(c,b,d)
    judge(d,c,b)
    elif (b==c or b==d or b==c==d):#其中相同的情况直接输出
    print(B)
    elif (d==c and d!=b):#如果不添加d!=b,当出现b==c==d的情况时,会输出2次,程序无法通过
    print(C)

  • 1
    @ 2018-01-23 14:17:58

    C代码 写的没大神们好... 欢迎大家指正修改!
    #include <stdio.h>
    #include <string.h>
    int Right(char *a, char *b,char *c,int length);
    int main(int argc, const char * argv[]) {
    int length;
    scanf("%d",&length);
    char a[length+1],b[length+1],c[length+1];
    scanf("%s %s %s",a,b,c);
    a[length] = b[length] = c[length] = '\0';
    if (Right(a, b, c, length)) printf("%s",a);
    else if (Right(b, a, c, length)) printf("%s",b);
    else if (Right(c, b, a, length)) printf("%s",c);
    else if (Right(a, c, b, length)) printf("%s",a);
    else if (Right(b, c, a, length)) printf("%s",b);
    else if (Right(c, a, b, length)) printf("%s",c);
    return 0;
    }

    int Right(char *a, char *b,char *c,int length)
    {
    char x[length+1],y[length+1],z[length+1];
    strcpy(x, a);
    for (int i = 0; i < length/2; i++) {
    char temp = x[i];
    x[i] = x[length-1-i];
    x[length-1-i] = temp;
    }
    for (int k = 0; k <= 6; k++) {
    strcpy(y, b);
    strcpy(z, c);
    for (int j = 0; j < length; j++) {
    y[j] = y[j] + k;
    if (y[j] > 'z') y[j] -= 26;
    z[j] = z[j] - k;
    if (z[j] < 'a') z[j] += 26;
    }
    if (!strcmp(x, y) && !strcmp(x, z)) {
    strcpy(a, x);
    return 1;
    }
    }
    return 0;
    }

  • 1
    @ 2017-11-06 22:40:46

    java版javajava
    /*
    * 分析:
    * 1、输入的三个字符串的位置是随机的。也是就说无论哪一个都有可能是反串,移位依然。
    * 2、既然如此就就要对每一个字符串进行循环判断。确定哪一个是反串,
    * 哪一个是左移位得到的,哪一个是右位移得到的。
    * 3、因为String中没有直接进行反串的方法,下面用StringBuilder进行试验。
    * 思路:
    * 1、创建反串方法。
    * 2、创建位移方法。
    * 3、判断哪一个才是反串和左右位移。
    * 4、判断完成后输出原字符串。
    *

    */
    import java.util.Scanner;
    public class test2 {

    /**
    *
    * @param str 需要反转的字符串
    * @return 反转后的字符串
    */
    public static String fz(String str)
    {
    StringBuilder ss=new StringBuilder();
    for(int i=str.length()-1;i>=0;i--)
    {
    ss.append(String.valueOf(str.charAt(i)));
    }
    String s=ss.toString();
    return s;
    }

    /**
    * 用来实现原字符串向左右方向位移的方法。
    * @param str 26个字符。
    * @param s1 被反转的字符串
    * @param s2 需要位移的字符串。
    * @param n 字符串的长度。
    * @param k 需要位移几位。
    * @return 被反转的字符串和位移的字符串是否相同。
    */
    public static boolean shift(String str,String s1,String s2,int n, int k)
    {
    for (int i = 0; i < n; i++) {
    if(str.charAt((s2.charAt(i)-'a'+k+26)%26)!=s1.charAt(i))
    return false;
    }
    return true;
    }

    public static void main(String[] args) {

    Scanner sc=new Scanner(System.in);
    //26个字符
    String str = "abcdefghijklmnopqrstuvwxyz";

    //用来记录3个字符串
    String s[]=new String[3];
    //长度
    int n=sc.nextInt();

    //输入字符串
    for (int i = 0; i < s.length; i++) {
    s[i]=sc.next();
    }
    for (int i = 0; i < s.length; i++)
    {
    //反转
    String t=fz(s[i]);

    //右位移
    for (int j = 0; j < 3; j++)
    {
    if(j!=i)
    {
    for (int k = 0; k <= 6; k++)
    {
    if(shift(str, t, s[j], n, k))
    {
    //右位移
    for(int l=0;l<3;l++)
    {
    if(l!=i&&l!=j)
    {
    if(shift(str, t, s[l], n, -k))
    {
    System.out.println(t);
    return ;

    }
    }
    }

    }
    }
    }
    }

    }

    }
    }

  • 1
    @ 2017-10-26 23:20:23

    测试数据很弱,如果就只看第一位是不太对的,这里如果先b,d 与c比较 这里差值都是1,看起来是符合规律的,但是实际上是不符合的,
    #include <iostream>
    #include <cmath>
    #include <cstring>
    #include <algorithm>

    using namespace std;
    //zabc
    //dcba
    //bcde
    bool judge(string a, string b, string c, int n){
    int lena = c[n-1] - a[0];
    int lenb = c[n-1] - b[0];
    return (lena + lenb) % 26 ==0;
    }

    void slove(){
    int n;
    string a,b,c;
    cin>>n;
    cin.ignore();
    cin>>a>>b>>c;
    if(judge(a, b, c, n)){
    reverse(c.begin(),c.end());
    cout<<c<<endl;
    }else if(judge(a, c, b, n)){
    reverse(b.begin(), b.end());
    cout<<b<<endl;
    }else {
    reverse(a.begin(), a.end());
    cout<<a<<endl;
    }
    }

    int main(){
    slove();
    return 0;
    }

  • 0
    @ 2022-01-22 13:37:27

    直接暴力不香???
    #include <iostream>
    using namespace std;
    string a,b,c;
    string p1[15],p2[15],p3[15];
    int main() {
    int n;
    cin >> n;
    cin >> a>>b>>c ;
    for (int i = 0; i < n ; i++) {
    p1[0]+=a[n-i-1];
    p2[0]+=b[n-i-1];
    p3[0]+=c[n-i-1];
    }
    p1[1]=a;
    p2[1]=b;
    p3[1]=c;
    for (int k = 1; k <= 6 ;k++) {
    for(int i=0;i<n;i++){
    p1[k+1]+=(char)('a'+(a[i]-'a'-k+26)%26);
    p2[k+1]+=(char)('a'+(b[i]-'a'-k+26)%26);
    p3[k+1]+=(char)('a'+(c[i]-'a'-k+26)%26);
    }
    }
    p1[8]=a;
    p2[8]=b;
    p3[8]=c;
    for (int k = 1; k <= 6 ;k++) {
    for(int i=0;i<n;i++){
    p1[k+8]+=(char)('a'+(a[i]-'a'+k)%26);
    p2[k+8]+=(char)('a'+(b[i]-'a'+k)%26);
    p3[k+8]+=(char)('a'+(c[i]-'a'+k)%26);
    }
    }
    for(int i=1;i<=7;i++){
    if(p1[0]==p2[i]&&p1[0]==p3[i+7])return cout<<p1[0],0;
    if(p1[0]==p2[i+7]&&p1[0]==p3[i])return cout<<p1[0],0;
    }
    for(int i=1;i<=7;i++){
    if(p2[0]==p1[i]&&p2[0]==p3[i+7])return cout<<p2[0],0;
    if(p2[0]==p1[i+7]&&p2[0]==p3[i])return cout<<p2[0],0;
    }
    for(int i=1;i<=7;i++){
    if(p3[0]==p2[i]&&p3[0]==p1[i+7])return cout<<p3[0],0;
    if(p3[0]==p2[i+7]&&p3[0]==p1[i])return cout<<p3[0],0;
    }
    }

信息

ID
1449
难度
6
分类
字符串 | 模拟 点击显示
标签
递交数
6889
已通过
1848
通过率
27%
被复制
9
上传者