64,641
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
using namespace std;
char str[4005][1008];
long long ans;
int n,len[4005];
void str_cmp(int a,int b)
{
int i,l;
if(len[a]!=len[b])
l=len[a]<len[b]?len[a]:len[b],ans++;
else
l=len[a],ans+=2;
for(i=0;i<l;i++)
if(str[a][i]==str[b][i])
ans+=2;
else
return ;
}
int main()
{
// freopen("in.txt","r",stdin);
int i,j,cas=1;
char buf;
while(scanf("%d%c",&n,&buf)&&n)
{
gets(str[0]);
len[0]=strlen(str[0]);
ans=0;
for(i=1;i<n;i++)
{
gets(str[i]);
len[i]=strlen(str[i]);
for(j=i-1;j>=0;j--)
str_cmp(i,j);
}
cout<<"Case "<<cas++<<": "<<ans<<endl;
}
return 0;
}
#include <stdio.h>
#include <memory.h>
int cmpTimes( char* p, char* q )
{
char* s = p;
while( *s == *q && *s ){ ++s; ++q; }
return ( s - p + 1 ) * 2 - ( (*s + *q) ? 1 : 0 );
}
char str[4000][1001];
int mat[4000][4000];
int likeleft[4000];
int main()
{
int i, j, k, N, l, m, n, s;
long long t;
for( i = 1; scanf("%d%*c", &N), N; i++ )
{
memset( &mat[0][0], 0, 4000*4000*sizeof(int) );
memset( likeleft, 0, 4000*sizeof(int) );
t = 0;
gets( str[0] );
for( j = 1; j < N; j++ )
{
gets( str[j] );
likeleft[j] = 0;
mat[0][j] = cmpTimes( str[0], str[j] );
t += mat[0][j];
for( k = 1; k < j; k++ )
{
l = likeleft[k];
m = mat[l][j];
n = mat[l][k];
if( m != n ) mat[k][j] = m < n ? m : n;
else if( m & 1 ){
s = ( m - 1 )>>1;
mat[k][j] = m - 1 + cmpTimes( str[k] + s, str[j] + s );
}
else mat[k][j] = m;
mat[likeleft[j]][j] < mat[k][j] && ( likeleft[j] = k );
t += mat[k][j];
}
}
printf("Case %d: %lld\n", i, t );
}
return 0;
}
#include <iostream>
#include <list>
#include <numeric>
#include <algorithm>
using namespace std;
#define MAX_CHAR_ID ('z' - '0' + 1)
#define MAX_STR_POS 1000
#define MAX_STR_ID 4000
typedef list<int> STR_ID_LIST;
STR_ID_LIST str_id_list[MAX_CHAR_ID][MAX_STR_POS];
STR_ID_LIST same_str_id_list; //与当前输入的字符串相同的已输入字符串的编号
int str_len[MAX_STR_ID];
char str[MAX_STR_POS + 1];
long ans;
int n;
int max_len;
/*检查第1个字符*/
void check_first_char(int char_id, int str_id)
{
STR_ID_LIST::iterator i;
for (i = str_id_list[char_id][0].begin(); i != str_id_list[char_id][0].end(); ++i)
{
same_str_id_list.push_back(*i);
}
ans += (same_str_id_list.size() + str_id);
}
/*检查其他字符*/
void check_rest_chars(int char_id, int str_pos, int str_id)
{
STR_ID_LIST::iterator i = same_str_id_list.begin();
STR_ID_LIST::iterator j;
while (i != same_str_id_list.end())
{
j = i++;
if (binary_search(str_id_list[char_id][str_pos].begin(),
str_id_list[char_id][str_pos].end(),
*j))
{
ans += 2;
}
else
{
if (str_len[*j] >= str_len[str_id])
{
ans++;
}
same_str_id_list.erase(j);
}
}
}
/*重置reset_str_id_list*/
void reset_str_id_list (void)
{
int i, j;
for (i = 0; i < MAX_CHAR_ID; i++)
{
for (j = 0; j < max_len; j++)
{
str_id_list[i][j].clear();
}
}
same_str_id_list.clear();
}
int main()
{
int i, j, cas=1;
char dummy;
freopen("a.txt","r",stdin);
while(scanf("%d%c",&n,&dummy)&&n)
{
ans = max_len = 0;
for (i = 0; i < n; i++)
{
char c;
int len;
gets(str);
str_len[i] = len = strlen(str);
if (max_len < len)
{
max_len = len;
}
for (j = 0; c = str[j]; j++)
{
/*把字符转换为str_id_list的第1个下标*/
int char_id = c- '0';
if (i > 0)
{
if (j == 0)
{
check_first_char(char_id, i);
}
else if (same_str_id_list.size() > 0)
{
check_rest_chars(char_id, j, i);
}
}
str_id_list[char_id][j].push_back(i);/*把当前输入字符串的编号存入str_id_list*/
}
}
cout << "Case " << cas++ << ans << endl;
reset_str_id_list();
}
return 0;
}
#define MAX_CHAR_ID ('z' - '0' + 1)
//int char_id = convert_char_index(c);
int char_id = c - '0';
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_CHAR_ID 62
#define MAX_STR_POS 1000
#define MAX_STR_ID 4000
typedef struct _str_id_type
{
int id; //输入字符串的编号
struct _str_id_type *next;
} str_id_type;
str_id_type str_id_buff[MAX_CHAR_ID][MAX_STR_POS];
int same_str_id_buff[MAX_STR_ID]; //与当前输入的字符串相同的已输入字符串的编号
int same_str_id_count;
int str_len[MAX_STR_ID];
char str[MAX_STR_POS + 1];
long ans;
int n;
int max_len;
/*把字符转换为str_id_buff的第1个下标*/
int convert_char_index (char c)
{
int char_index;
if (c >='0' && c <= '9')
{
char_index = c - '0';
}
else if (c >='A' && c <= 'Z')
{
char_index = c - 'A' + 10;
}
else
{
char_index = c - 'a' + 36;
}
return char_index;
}
/*把当前输入字符串的编号存入str_id_buff*/
void put_str_id (int char_id, int str_pos, int str_id)
{
str_id_type *p = &str_id_buff[char_id][str_pos];
str_id_type *q = (str_id_type *)malloc(sizeof(str_id_type));
q->id = str_id;
q->next = p->next;
p->next = q;
}
/*检查第1个字符*/
void check_first_char(int char_id, int str_id)
{
str_id_type *p = str_id_buff[char_id][0].next;
same_str_id_count = 0;
while (p)
{
same_str_id_buff[same_str_id_count++] = p->id;
p = p->next;
}
ans += (same_str_id_count + str_id);
}
/*检查其他字符*/
void check_rest_chars(int char_id, int str_pos, int str_id)
{
int i = 0;
while (i < same_str_id_count)
{
int same_str_id = same_str_id_buff[i];
int found = 0;
str_id_type *p = str_id_buff[char_id][str_pos].next;
while (p)
{
if (same_str_id == p->id)
{
/*当前输入的字符串与以前输入的字符串的第str_pos个字符相同*/
found = 1;
break;
}
p = p->next;
}
if (found)
{
ans += 2;
i++;
}
else
{
if (str_len[same_str_id] >= str_len[str_id])
{
ans++;
}
/*把最后一个移到当前位置*/
same_str_id_buff[i] = same_str_id_buff[--same_str_id_count];
}
}
}
/*重置reset_str_id_buff*/
void reset_str_id_buff (void)
{
int i, j;
for (i = 0; i < MAX_CHAR_ID; i++)
{
for (j = 0; j < max_len; j++)
{
str_id_type *p = str_id_buff[i][j].next;
if (p)
{
str_id_type *q;
while (p)
{
q = p;
p = p->next;
free(q);
}
str_id_buff[i][j].next = NULL;
}
}
}
}
int main()
{
int i, j, cas=1;
char dummy;
freopen("a.txt","r",stdin);
while(scanf("%d%c",&n,&dummy)&&n)
{
ans = max_len = 0;
for (i = 0; i < n; i++)
{
char c;
int len;
gets(str);
str_len[i] = len = strlen(str);
if (max_len < len)
{
max_len = len;
}
for (j = 0; c = str[j]; j++)
{
int char_id = convert_char_index(c);
if (i > 0)
{
if (j == 0)
{
check_first_char(char_id, i);
}
else if (same_str_id_count > 0)
{
check_rest_chars(char_id, j, i);
}
}
put_str_id(char_id, j, i);
}
}
printf("Case %d: %d\n", cas++, ans);
reset_str_id_buff();
}
return 0;
}
codevoid str_cmp(int a,int b)
{int i,l;char*p=str[a];char*q=str[b];
l=len[a]<=len[b]?len[a]:len[b];
ans++;for(i=0;i<l;i++,p++,q++)if(*p==*q)
ans++;elsereturn ;
}