Language: C

#include <float.h>
#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

// 内部定数
#define D_STR_MAX		100000									// 最大文字列数
#define D_CHAR_MAX		500005									// 最大文字数
#define D_CHAR_KIND		27										// 文字種類数

// 内部構造体 - グループ情報
typedef struct Grp {
	int miCnt;													// 個数
	struct Grp *mzp1Next[D_CHAR_KIND];							// 次のグループ情報
} Div;

// 内部変数
static FILE *szpFpI;											// 入力
static char *scp1Str[D_STR_MAX];								// 文字列
static int siSCnt;												// 文字列数
static char sc1Char[D_CHAR_MAX];								// 全文字
static Grp sz1Grp[D_CHAR_MAX];									// グループ情報
static int siGCnt;												// グループ情報数

// 内部変数 - テスト用
#ifdef D_TEST
	static int siRes;
	static FILE *szpFpA;
	static int siTNo;
#endif

// １行出力
int
fOutLine(
	char *pcpLine				// <I> １行
)
{
	char lc1Buf[1024];

#ifdef D_TEST
	lc1Buf[0] = '\0';
	fgets(lc1Buf, sizeof(lc1Buf), szpFpA);
	if (strcmp(lc1Buf, pcpLine)) {
		siRes = -1;
	}
#else
	printf("%s", pcpLine);
#endif

	return 0;
}

// 改行カット・数値化
// 戻り値：文字数
int
fCutCrLf(
	char *pcpStr				// <I> 文字列
)
{
	int i;

	for (i = 0; pcpStr[i] != 0; i++) {
		if (pcpStr[i] == '\n') {
			pcpStr[i] = 0;
			break;
		}
		pcpStr[i] -= 'a' - 1;
	}

	return i;
}

// 実行メイン
int
fMain(
)
{
	int i, j, k;
	char lc1Buf[1024];

	// データ - 初期化
	memset(sc1Char, 0, sizeof(sc1Char));
	memset(sz1Grp, 0, sizeof(sz1Grp));
	siGCnt = 1;

	// 文字列数 - 取得
	fgets(lc1Buf, sizeof(lc1Buf), szpFpI);
	sscanf(lc1Buf, "%d", &siSCnt);

	// 文字列 - 取得
	char *lcpWork = sc1Char;
	for (i = 0; i < siSCnt; i++) {
		fgets(lcpWork, sizeof(sc1Char), szpFpI);
		int liLen = fCutCrLf(lcpWork);
		scp1Str[i] = lcpWork;

		// グループ - 追加
		Grp *lzpGrp = &sz1Grp[0];
		for (j = 0; j <= liLen; j++) {
			
			// 新規
			if (lzpGrp->mzp1Next[lcpWork[j]] == NULL) {
				lzpGrp->mzp1Next[lcpWork[j]] = &sz1Grp[siGCnt];
				siGCnt++;
			}

			// 次へ
			lzpGrp = lzpGrp->mzp1Next[lcpWork[j]];

			// 個数
			(lzpGrp->miCnt)++;
		}

		// 次回用
		lcpWork += liLen + 1;
	}

	// クエリ数 - 取得
	int liQCnt;
	fgets(lc1Buf, sizeof(lc1Buf), szpFpI);
	sscanf(lc1Buf, "%d", &liQCnt);

	// クエリ - 取得
	for (i = 0; i < liQCnt; i++) {

		// 位置 - 取得
		int liNo;
		fscanf(szpFpI, "%d", &liNo);
		liNo--;

		// 文字順序 - 取得
		char lc1Ord[128];
		fscanf(szpFpI, "%s", lc1Ord);
		fCutCrLf(lc1Ord);
		fgets(lc1Buf, sizeof(lc1Buf), szpFpI);

		// 順位 - 取得
		int liONo = 1;
		Grp *lzpGrp = &sz1Grp[0];
		for (j = 0; scp1Str[liNo][j] != 0; j++) {

			// 短い文字列
			if (lzpGrp->mzp1Next[0] != NULL) {
				liONo += lzpGrp->mzp1Next[0]->miCnt;
			}

			// 前に来る文字列
			for (k = 0; ; k++) {
				if (lc1Ord[k] == scp1Str[liNo][j]) {
					break;
				}
				if (lzpGrp->mzp1Next[lc1Ord[k]] != NULL) {
					liONo += lzpGrp->mzp1Next[lc1Ord[k]]->miCnt;
				}
			}

			// 次の文字へ
			lzpGrp = lzpGrp->mzp1Next[scp1Str[liNo][j]];
		}

		// 出力
		sprintf(lc1Buf, "%d\n", liONo);
		fOutLine(lc1Buf);
	}

	return 0;
}

// １回実行
int
fOne(
)
{
	int liRet;
	char lc1Buf[1024];

	// 入力 - セット
#ifdef D_TEST
	sprintf(lc1Buf, ".\\Test\\T%d.txt", siTNo);
	szpFpI = fopen(lc1Buf, "r");
	sprintf(lc1Buf, ".\\Test\\A%d.txt", siTNo);
	szpFpA = fopen(lc1Buf, "r");
	siRes = 0;
#else
	szpFpI = stdin;
#endif

	// 実行メイン
	liRet = fMain();

	// 残データ有無
#ifdef D_TEST
	lc1Buf[0] = '\0';
	fgets(lc1Buf, sizeof(lc1Buf), szpFpA);
	if (strcmp(lc1Buf, "")) {
		siRes = -1;
	}
#endif

	// テストファイルクローズ
#ifdef D_TEST
	fclose(szpFpI);
	fclose(szpFpA);
#endif

	// テスト結果
#ifdef D_TEST
	if (siRes == 0) {
		printf("OK %d\n", siTNo);
	}
	else {
		printf("NG %d\n", siTNo);
	}
#endif

	return 0;
}

// プログラム開始
int
main()
{

#ifdef D_TEST
	int i;
	for (i = D_TEST_SNO; i <= D_TEST_ENO; i++) {
		siTNo = i;
		fOne();
	}
#else
	fOne();
#endif

	return 0;
}



Compiler output:
main.c:25:8: error: unknown type name 'Grp'
   25 | static Grp sz1Grp[D_CHAR_MAX];                                                                  // グループ情報
      |        ^~~
main.c: In function 'fMain':
main.c:101:17: error: unknown type name 'Grp'; use 'struct' keyword to refer to the type
  101 |                 Grp *lzpGrp = &sz1Grp[0];
      |                 ^~~
      |                 struct 
main.c:105:35: error: request for member 'mzp1Next' in something not a structure or union
  105 |                         if (lzpGrp->mzp1Next[lcpWork[j]] == NULL) {
      |                                   ^~
main.c:106:39: error: request for member 'mzp1Next' in something not a structure or union
  106 |                                 lzpGrp->mzp1Next[lcpWork[j]] = &sz1Grp[siGCnt];
      |                                       ^~
main.c:111:40: error: request for member 'mzp1Next' in something not a structure or union
  111 |                         lzpGrp = lzpGrp->mzp1Next[lcpWork[j]];
      |                                        ^~
main.c:114:32: error: request for member 'miCnt' in something not a structure or union
  114 |                         (lzpGrp->miCnt)++;
      |                                ^~
main.c:142:17: error: unknown type name 'Grp'; use 'struct' keyword to refer to the type
  142 |                 Grp *lzpGrp = &sz1Grp[0];
      |                 ^~~
      |                 struct 
main.c:146:35: error: request for member 'mzp1Next' in something not a structure or union
  146 |                         if (lzpGrp->mzp1Next[0] != NULL) {
      |                                   ^~
main.c:147:48: error: request for member 'mzp1Next' in something not a structure or union
  147 |                                 liONo += lzpGrp->mzp1Next[0]->miCnt;
      |                                                ^~
main.c:155:43: error: request for member 'mzp1Next' in something not a structure or union
  155 |                                 if (lzpGrp->mzp1Next[lc1Ord[k]] != NULL) {
      |                                           ^~
main.c:156:56: error: request for member 'mzp1Next' in something not a structure or union
  156 |                                         liONo += lzpGrp->mzp1Next[lc1Ord[k]]->miCnt;
      |                                                        ^~
main.c:161:40: error: request for member 'mzp1Next' in something not a structure or union
  161 |                         lzpGrp = lzpGrp->mzp1Next[scp1Str[liNo][j]];
      |                                        ^~