若有,就不存,並把現有的token做tag;
若無,存起來。
吃完token後,把沒tag的資料做sort,
再output即可。
用linked list解,
練習ll的一些函式實作。
/* ACM 156 Ananagrams
* mythnc
* 2011/12/25 20:30:50
* run time: 0.008
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXL 21
#define FALSE 0
#define TRUE 1
typedef struct token {
int tag, len;
char word[MAXL];
struct token *next;
} Token;
Token *input(void);
int ananagrams(Token *, char *);
int sameletter(char *, char *);
void *deletetag(Token **);
void *sort(Token **);
void output(Token *);
void freel(Token *);
int main(void)
{
Token *head;
head = input();
deletetag(&head);
sort(&head);
output(head);
freel(head);
return 0;
}
/* input: eat input token */
Token *input(void)
{
char word[MAXL];
Token *tmp, *head, *current;
head = current = NULL;
while (scanf("%s", word) && word[0] != '#') {
if (head && !ananagrams(head, word))
continue;
tmp = (Token *)malloc(sizeof(Token));
if (!head)
head = tmp;
strcpy(tmp->word, word);
tmp->len = strlen(word);
tmp->tag = FALSE;
tmp->next = NULL;
if (current)
current->next = tmp;
current = tmp;
}
return head;
}
/* ananagrams: compare word in ll vs w,
* if they are anagrams return FALSE
* else return TRUE */
int ananagrams(Token *pt, char *w)
{
while (pt) {
if (pt->len == strlen(w) && sameletter(pt->word, w)) {
pt->tag = TRUE;
return FALSE;
}
pt = pt->next;
}
return TRUE;
}
/* sameletter: if s and t have same letter
* return TRUE else return FALSE */
int sameletter(char *s, char *t)
{
int letters[26] = { 0 };
int i;
for (i = 0; i < strlen(s); i++)
if (s[i] >= 'A' && s[i] <= 'Z')
letters[s[i] - 'A']++;
/* lowercase */
else
letters[s[i] - 'a']++;
for (i = 0; i < strlen(t); i++)
if (t[i] >= 'A' && t[i] <= 'Z') {
if (letters[t[i] - 'A'] == 0)
return FALSE;
letters[t[i] - 'A']--;
}
/* lowercase */
else {
if (letters[t[i] - 'a'] == 0)
return FALSE;
letters[t[i] - 'a']--;
}
return TRUE;
}
/* deletetag: if tag == TRUE, delete it */
void *deletetag(Token **head)
{
Token *pre, *pt, *tmp;
pre = NULL;
pt = *head;
while (pt) {
if (pt->tag) {
if (!pre) {
tmp = *head;
*head = (*head)->next;
}
else {
tmp = pt;
pre->next = pt->next;
}
free(tmp);
pt = pt->next;
continue;
}
pre = pt;
pt = pt->next;
}
}
/* sort: insertion sort linked list */
void *sort(Token **head)
{
Token *i, *j, *pre, *tmpi, *tmpj;
for (i = (*head)->next; i; i = i->next) {
tmpi = i;
for (j = *head, pre = NULL; j != tmpi; pre = j, j = j->next)
if (strcmp(tmpi->word, j->word) < 0) {
if (pre)
pre->next = tmpi;
else
*head = tmpi;
tmpj = j;
while (tmpj->next != tmpi)
tmpj = tmpj->next;
tmpj->next = tmpi->next;
tmpi->next = j;
break;
}
}
}
/* output: output result */
void output(Token *pt)
{
for (; pt; pt = pt->next)
printf("%s\n", pt->word);
}
/* free: free linked list */
void freel(Token *pt)
{
Token *tmp;
while (pt) {
tmp = pt;
free(tmp);
pt = pt->next;
}
}
沒有留言:
張貼留言