UVa 10716 - Evil Straw Warts Live
#include<stdio.h>
#include <string.h>
bool isPossible(char sequence[])
{
//紀錄每個字母的出現次數
int occurrences[26] = {};
//printf("%d",strlen(sequence));
for(int i=0; i<strlen(sequence); i++)
{
int num = (int)sequence[i]-97;
occurrences[num]++;
}
//計算出現次數為奇數的字母個數
int odd=0;
for(int i=0; i<26; i++)
{
if(occurrences[i]%2==1)
odd++;
if(odd>1)
return false;
}
return true;
}
int change(char sequence[])
{
int left = 0;
int right = strlen(sequence)-1;
int answer = 0;
while(left<right)
{
int letter_site[26][3] ={};
letter_site[0][0] = (int)sequence[left];//0 字母編號
letter_site[0][1] = left; //字母出現最左邊位子
letter_site[0][2] = left; //字母出現最右邊位子
int key=0;
for(int i=left+1;i<right+1; i++) //新字母
{
for(int j=left;j<i;j++) //舊字母
{
if(letter_site[j-left][0] == (int)sequence[i])
{
letter_site[j-left][2] = i;
key=1;
}
}
if(key==0)
{
letter_site[i-left][0] = (int)sequence[i];//0 字母編號
letter_site[i-left][1] = i; //字母出現最左邊位子
letter_site[i-left][2] = i; //字母出現最右邊位子
}
}
/*for(int i=0;i<10;i++)
{
printf("char:%c left:%d right:%d distance:%d\n",letter_site[i][0],letter_site[i][1],letter_site[i][2],letter_site[i][1]-left+right-letter_site[i][2]);
}*/
int distance = strlen(sequence);
int smallest_num = 0;
for(int i=0;i<26; i++)
{
if((letter_site[i][1]-left+right-letter_site[i][2])<distance)
{
smallest_num=i;
distance = letter_site[i][1]-left+right-letter_site[i][2];
}
}
answer += distance;
for(int i=letter_site[smallest_num][1];i>left;i--)
{
sequence[i] = sequence[i-1];
}
sequence[left] = (char)letter_site[smallest_num][0];
for(int i=letter_site[smallest_num][2];i<right;i++)
{
sequence[i] = sequence[i+1];
}
sequence[right] = (char)letter_site[smallest_num][0];
//printf("%s\n",sequence);
left++;
right--;
}
//printf("%s\n",sequence);
return answer;
}
int main()
{
int casenum = 0;
scanf("%d",&casenum);
for(int i=0; i<casenum; i++)
{
char sequence[100];
scanf("%s",sequence);
if(isPossible(sequence))
{
int answer = change(sequence);
printf("%d\n",answer);
}
else
printf("Impossible\n");
}
}