Cipher--POJ 1026

8352 단어 poj
1. 제목 유형: 문자열, 그룹 바꾸기.
2. 문제 풀이 사고방식: (1) n개의 인코딩을 입력하는 순서에 따라 각각 한 문자의 교환 주기를 기록하고Cy[i]로 기록한다.(2) 인코딩 횟수 k는Cy[i]에 대해 각각 나머지를 구하고 나머지는 이 문자의 k회 교체 후의 위치이다.
3. 주의사항: 전체 시퀀스에 주기를 구할 수 없음(이 주기는 n개의 단일 문자 주기의 최소 공배수)이다. 그렇지 않으면 TLE가 된다.
4. 실현 방법:

  
    
#include < iostream >
#include
< string >
using namespace std;

int n;
int pos[ 210 ],Cy[ 210 ];

void Solve()
{
int k,i,j,m,len;
char str[ 210 ],ans[ 210 ];
while (cin >> k && k)
{
getchar();
gets(str);
len
= strlen(str);
while (len < n)
{
str[len
++ ] = ' ' ;
}
str[len]
= ' \0 ' ;
for (i = 0 ;i < n;i ++ )
{
m
= k % Cy[i];
j
= i;
while (m -- )
j
= pos[j] - 1 ;
ans[j]
= str[i];
}
ans[n]
= ' \0 ' ;
cout
<< ans << endl;
}
}

int main()
{
int i,j;
while (cin >> n && n)
{
memset(Cy,
0 , sizeof (Cy));
for (i = 0 ;i < n;i ++ )
cin
>> pos[i];
for (i = 0 ;i < n;i ++ )
{
j
= i;
while (pos[j] != i + 1 )
{
j
= pos[j] - 1 ;
Cy[i]
++ ;
}
Cy[i]
++ ;
}
Solve();
cout
<< endl;
}
return 0 ;
}

좋은 웹페이지 즐겨찾기