poj 1026 Chipher

http://poj.org/problem?id=1026

找到每个循环 并记录循环里有多少个数

对每个循环的字符进行移动 移动一次是一个循环 移动的次数 为循环里数的个数的余数

代码:

#include<iostream>

#include<cstdio>

#include<algorithm>

#include<cstring>

#include<map>

#include<cmath>

#define LL long long



using namespace std;



const int N=205;



int a[N];

int num[N];

char s[N];



void findnum(int n)

{

    memset(num,-1,sizeof(num));

    for(int i=0;i<n;++i)

    {

        if(num[i]==-1)

        {

            num[i]=1;

            int l=a[i];

            while(l!=i)

            {

                num[l]=0;

                ++num[i];

                l=a[l];

            }

        }

    }

}

void encode(int k,int n)

{

    for(int i=0;i<n;++i)

    {

        if(num[i]>0)

        {

            int w=k%num[i];

            while(w--)

            {

                char ctemp=s[i];

                int l=i;

                while(a[l]!=i)

                {

                    char c=s[a[l]];

                    s[a[l]]=ctemp;//cout<<a[l]<<" "<<s[l]<<endl;

                    l=a[l];

                    ctemp=c;

                }//cout<<l<<" "<<i<<endl;

                s[i]=ctemp;

            }

        }

    }

}

int main()

{

    int n;

    while(scanf("%d",&n)!=EOF,n)

    {

        for(int i=0;i<n;++i)

        {

            scanf("%d",&a[i]);

            --a[i];

        }

        findnum(n);

        int k;

        while(scanf("%d",&k),k)

        {

            getchar();

            gets(s);

            for(int i=strlen(s);i<n;++i)

            {

                s[i]=' ';

            }

            s[n]='\0';

            //puts(s);

            encode(k,n);



            for(int i=0;i<n;++i)

            {

                printf("%c",s[i]);

            }

            printf("\n");

        }

        printf("\n");

    }

    return 0;

}

  

你可能感兴趣的:(poj)